Page Speed Optimization Libraries
1.7.30.4
|
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_