Page Speed Optimization Libraries  1.5.27.2
net/instaweb/rewriter/public/javascript_code_block.h
Go to the documentation of this file.
00001 /*
00002  * Copyright 2010 Google Inc.
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *      http:///www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  */
00016 
00018 
00019 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_JAVASCRIPT_CODE_BLOCK_H_
00020 #define NET_INSTAWEB_REWRITER_PUBLIC_JAVASCRIPT_CODE_BLOCK_H_
00021 
00022 #include <cstddef>
00023 
00024 #include "base/logging.h"
00025 #include "net/instaweb/util/public/basictypes.h"
00026 #include "net/instaweb/util/public/escaping.h"
00027 #include "net/instaweb/util/public/google_url.h"
00028 #include "net/instaweb/util/public/hasher.h"
00029 #include "net/instaweb/util/public/string.h"
00030 #include "net/instaweb/util/public/string_util.h"
00031 
00032 namespace net_instaweb {
00033 
00034 class JavascriptLibraryIdentification;
00035 class MessageHandler;
00036 class Statistics;
00037 class Variable;
00038 
00042 class JavascriptRewriteConfig {
00043  public:
00044   JavascriptRewriteConfig(
00045       Statistics* statistics, bool minify,
00046       const JavascriptLibraryIdentification* identification);
00047 
00048   static void InitStats(Statistics* statistics);
00049 
00052   bool minify() const { return minify_; }
00053   const JavascriptLibraryIdentification* library_identification() const {
00054     return library_identification_;
00055   }
00056 
00057   Variable* blocks_minified() { return blocks_minified_; }
00058   Variable* libraries_identified() { return libraries_identified_; }
00059   Variable* minification_failures() { return minification_failures_; }
00060   Variable* total_bytes_saved() { return total_bytes_saved_; }
00061   Variable* total_original_bytes() { return total_original_bytes_; }
00062   Variable* num_uses() { return num_uses_; }
00063   Variable* num_reducing_uses() { return num_reducing_minifications_; }
00064 
00065   Variable* minification_disabled() { return minification_disabled_; }
00066   Variable* did_not_shrink() { return did_not_shrink_; }
00067   Variable* failed_to_write() { return failed_to_write_; }
00068 
00070   static const char kBlocksMinified[];
00071   static const char kLibrariesIdentified[];
00072   static const char kMinificationFailures[];
00073   static const char kTotalBytesSaved[];
00074   static const char kTotalOriginalBytes[];
00075   static const char kMinifyUses[];
00076   static const char kNumReducingMinifications[];
00077 
00079   static const char kJSMinificationDisabled[];
00080   static const char kJSDidNotShrink[];
00081   static const char kJSFailedToWrite[];
00082 
00083  private:
00084   bool minify_;
00086   const JavascriptLibraryIdentification* library_identification_;
00087 
00092   Variable* blocks_minified_;
00094   Variable* libraries_identified_;
00096   Variable* minification_failures_;
00098   Variable* total_bytes_saved_;
00102   Variable* total_original_bytes_;
00105   Variable* num_uses_;
00107   Variable* num_reducing_minifications_;
00108 
00111   Variable* minification_disabled_;
00113   Variable* did_not_shrink_;
00115   Variable* failed_to_write_;
00116 
00117   DISALLOW_COPY_AND_ASSIGN(JavascriptRewriteConfig);
00118 };
00119 
00127 class JavascriptCodeBlock {
00128  public:
00129   JavascriptCodeBlock(const StringPiece& original_code,
00130                       JavascriptRewriteConfig* config,
00131                       const StringPiece& message_id,
00132                       MessageHandler* handler);
00133 
00134   virtual ~JavascriptCodeBlock();
00135 
00138   static bool UnsafeToRename(const StringPiece& script);
00139 
00142   bool ProfitableToRewrite() const {
00143     RewriteIfNecessary();
00144     return (output_code_.size() < original_code_.size());
00145   }
00146 
00149   const StringPiece Rewritten() const {
00150     RewriteIfNecessary();
00151     return output_code_;
00152   }
00153 
00157   GoogleString* RewrittenString() const {
00158     RewriteIfNecessary();
00159     DCHECK(rewritten_code_.size() < original_code_.size());
00160     return &rewritten_code_;
00161   }
00162 
00167   StringPiece ComputeJavascriptLibrary() const;
00168 
00172   static void ToJsStringLiteral(const StringPiece& original,
00173                                 GoogleString* escaped) {
00174     EscapeToJsStringLiteral(original, true , escaped);
00175   }
00176 
00180   static GoogleString JsUrlHash(const GoogleString &url, Hasher *hasher) {
00181     GoogleString url_hash = hasher->Hash(GoogleUrl(url).PathAndLeaf());
00184     size_t pos = 0;
00185     while ((pos = url_hash.find_first_of('-', pos)) != GoogleString::npos) {
00186       url_hash[pos] = '$';
00187     }
00188     return url_hash;
00189   }
00190 
00192   const GoogleString& message_id() const {
00193     return message_id_;
00194   }
00195 
00196  protected:
00198   void Rewrite() const;
00199 
00200   JavascriptRewriteConfig* config_;
00201   const GoogleString message_id_; 
00202   MessageHandler* handler_;
00203   const GoogleString original_code_;
00204 
00205  private:
00206   void RewriteIfNecessary() const {
00207     if (!rewritten_) {
00208       Rewrite();
00209       rewritten_ = true;
00210     }
00211   }
00212 
00215   mutable bool rewritten_;
00216 
00220   mutable StringPiece output_code_;
00221   mutable GoogleString rewritten_code_;
00222 
00223   DISALLOW_COPY_AND_ASSIGN(JavascriptCodeBlock);
00224 };
00225 
00226 }  
00227 
00228 #endif  ///< NET_INSTAWEB_REWRITER_PUBLIC_JAVASCRIPT_CODE_BLOCK_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines