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