Page Speed Optimization Libraries  1.8.31.3
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 <vector>
00025 
00026 #include "base/logging.h"
00027 #include "net/instaweb/util/public/basictypes.h"
00028 #include "net/instaweb/util/public/escaping.h"
00029 #include "net/instaweb/util/public/google_url.h"
00030 #include "net/instaweb/util/public/hasher.h"
00031 #include "net/instaweb/util/public/string.h"
00032 #include "net/instaweb/util/public/string_util.h"
00033 
00034 namespace pagespeed { namespace js { struct JsTokenizerPatterns; } }
00035 
00036 namespace net_instaweb {
00037 
00038 class JavascriptLibraryIdentification;
00039 class MessageHandler;
00040 class Statistics;
00041 class Variable;
00042 
00043 namespace source_map { struct Mapping; }
00044 
00048 class JavascriptRewriteConfig {
00049  public:
00050   JavascriptRewriteConfig(
00051       Statistics* statistics, bool minify, bool use_experimental_minifier,
00052       const JavascriptLibraryIdentification* identification,
00053       const pagespeed::js::JsTokenizerPatterns* js_tokenizer_patterns);
00054 
00055   static void InitStats(Statistics* statistics);
00056 
00058   bool minify() const { return minify_; }
00062   bool use_experimental_minifier() const { return use_experimental_minifier_; }
00063   const JavascriptLibraryIdentification* library_identification() const {
00064     return library_identification_;
00065   }
00066   const pagespeed::js::JsTokenizerPatterns* js_tokenizer_patterns() const {
00067     return js_tokenizer_patterns_;
00068   }
00069 
00070   Variable* blocks_minified() { return blocks_minified_; }
00071   Variable* libraries_identified() { return libraries_identified_; }
00072   Variable* minification_failures() { return minification_failures_; }
00073   Variable* total_bytes_saved() { return total_bytes_saved_; }
00074   Variable* total_original_bytes() { return total_original_bytes_; }
00075   Variable* num_uses() { return num_uses_; }
00076   Variable* num_reducing_uses() { return num_reducing_minifications_; }
00077 
00078   Variable* minification_disabled() { return minification_disabled_; }
00079   Variable* did_not_shrink() { return did_not_shrink_; }
00080   Variable* failed_to_write() { return failed_to_write_; }
00081 
00083   static const char kBlocksMinified[];
00084   static const char kLibrariesIdentified[];
00085   static const char kMinificationFailures[];
00086   static const char kTotalBytesSaved[];
00087   static const char kTotalOriginalBytes[];
00088   static const char kMinifyUses[];
00089   static const char kNumReducingMinifications[];
00090 
00092   static const char kJSMinificationDisabled[];
00093   static const char kJSDidNotShrink[];
00094   static const char kJSFailedToWrite[];
00095 
00096  private:
00097   bool minify_;
00098   bool use_experimental_minifier_;
00100   const JavascriptLibraryIdentification* library_identification_;
00101   const pagespeed::js::JsTokenizerPatterns* js_tokenizer_patterns_;
00102 
00107   Variable* blocks_minified_;
00109   Variable* libraries_identified_;
00111   Variable* minification_failures_;
00113   Variable* total_bytes_saved_;
00117   Variable* total_original_bytes_;
00120   Variable* num_uses_;
00122   Variable* num_reducing_minifications_;
00123 
00126   Variable* minification_disabled_;
00128   Variable* did_not_shrink_;
00130   Variable* failed_to_write_;
00131 
00132   DISALLOW_COPY_AND_ASSIGN(JavascriptRewriteConfig);
00133 };
00134 
00142 class JavascriptCodeBlock {
00143  public:
00144   JavascriptCodeBlock(const StringPiece& original_code,
00145                       JavascriptRewriteConfig* config,
00146                       const StringPiece& message_id,
00147                       MessageHandler* handler);
00148 
00149   virtual ~JavascriptCodeBlock();
00150 
00154   bool Rewrite();
00155 
00158   bool successfully_rewritten() const {
00159     DCHECK(rewritten_);
00160     return successfully_rewritten_;
00161   }
00164   StringPiece rewritten_code() const {
00165     DCHECK(rewritten_);
00166     DCHECK(successfully_rewritten_);
00167     return rewritten_code_;
00168   }
00169 
00173   const std::vector<source_map::Mapping>& SourceMappings() const {
00174     DCHECK(rewritten_);
00175     DCHECK(successfully_rewritten_);
00176     return source_mappings_;
00177   }
00178 
00185   void AppendSourceMapUrl(StringPiece url);
00186 
00193   StringPiece ComputeJavascriptLibrary() const;
00194 
00199   void SwapRewrittenString(GoogleString* other);
00200 
00203   static bool UnsafeToRename(const StringPiece& script);
00204 
00208   static void ToJsStringLiteral(const StringPiece& original,
00209                                 GoogleString* escaped) {
00210     EscapeToJsStringLiteral(original, true , escaped);
00211   }
00212 
00216   static GoogleString JsUrlHash(const GoogleString &url, Hasher *hasher) {
00217     GoogleString url_hash = hasher->Hash(GoogleUrl(url).PathAndLeaf());
00220     size_t pos = 0;
00221     while ((pos = url_hash.find_first_of('-', pos)) != GoogleString::npos) {
00222       url_hash[pos] = '$';
00223     }
00224     return url_hash;
00225   }
00226 
00228   const GoogleString& message_id() const { return message_id_; }
00229 
00230  private:
00232   static bool IsSanitarySourceMapUrl(StringPiece url);
00233 
00235   bool MinifyJs(StringPiece input, GoogleString* output,
00236                 std::vector<source_map::Mapping>* source_mappings);
00237 
00238   JavascriptRewriteConfig* config_;
00239   const GoogleString message_id_; 
00240   const GoogleString original_code_;
00241   GoogleString rewritten_code_;
00242   std::vector<source_map::Mapping> source_mappings_;
00243 
00246   bool rewritten_;
00247   bool successfully_rewritten_;
00248 
00249   MessageHandler* handler_;
00250 
00251   DISALLOW_COPY_AND_ASSIGN(JavascriptCodeBlock);
00252 };
00253 
00254 }  
00255 
00256 #endif  ///< NET_INSTAWEB_REWRITER_PUBLIC_JAVASCRIPT_CODE_BLOCK_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines