00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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/rewriter/public/javascript_library_identification.h"
00026 #include "net/instaweb/util/public/basictypes.h"
00027 #include "net/instaweb/util/public/escaping.h"
00028 #include "net/instaweb/util/public/google_url.h"
00029 #include "net/instaweb/util/public/hasher.h"
00030 #include "net/instaweb/util/public/string.h"
00031 #include "net/instaweb/util/public/string_util.h"
00032
00033 namespace net_instaweb {
00034
00035 class MessageHandler;
00036 class Statistics;
00037 class Variable;
00038
00042 class JavascriptRewriteConfig {
00043 public:
00044 explicit JavascriptRewriteConfig(Statistics* statistics);
00045
00046 static void Initialize(Statistics* statistics);
00047
00050 bool minify() const { return minify_; }
00051 void set_minify(bool minify) { minify_ = minify; }
00054 bool redirect() const { return redirect_; }
00055 void set_redirect(bool redirect) { redirect_ = redirect; }
00056
00057 Variable* blocks_minified() { return blocks_minified_; }
00058 Variable* minification_failures() { return minification_failures_; }
00059 Variable* total_bytes_saved() { return total_bytes_saved_; }
00060 Variable* total_original_bytes() { return total_original_bytes_; }
00061 Variable* num_uses() { return num_uses_; }
00062
00064 static const char kBlocksMinified[];
00065 static const char kMinificationFailures[];
00066 static const char kTotalBytesSaved[];
00067 static const char kTotalOriginalBytes[];
00068 static const char kMinifyUses[];
00069
00070 private:
00071 bool minify_;
00072 bool redirect_;
00073
00076 Variable* blocks_minified_;
00078 Variable* minification_failures_;
00080 Variable* total_bytes_saved_;
00084 Variable* total_original_bytes_;
00087 Variable* num_uses_;
00088
00089 DISALLOW_COPY_AND_ASSIGN(JavascriptRewriteConfig);
00090 };
00091
00099 class JavascriptCodeBlock {
00100 public:
00101 JavascriptCodeBlock(const StringPiece& original_code,
00102 JavascriptRewriteConfig* config,
00103 const StringPiece& message_id,
00104 MessageHandler* handler);
00105
00106 virtual ~JavascriptCodeBlock();
00107
00110 static bool UnsafeToRename(const StringPiece& script);
00111
00114 bool ProfitableToRewrite() {
00115 RewriteIfNecessary();
00116 return (output_code_.size() < original_code_.size());
00117 }
00120
00123 const StringPiece Rewritten() {
00124 RewriteIfNecessary();
00125 return output_code_;
00126 }
00127
00130 GoogleString* RewrittenString() {
00131 RewriteIfNecessary();
00132 DCHECK(rewritten_code_.size() < original_code_.size());
00133 return &rewritten_code_;
00134 }
00135
00139 const JavascriptLibraryId ComputeJavascriptLibrary();
00140
00144 static void ToJsStringLiteral(const StringPiece& original,
00145 GoogleString* escaped) {
00146 EscapeToJsStringLiteral(original, true , escaped);
00147 }
00148
00152 static GoogleString JsUrlHash(const GoogleString &url, Hasher *hasher) {
00153 GoogleString url_hash = hasher->Hash(GoogleUrl(url).PathAndLeaf());
00156 size_t pos = 0;
00157 while ((pos = url_hash.find_first_of('-', pos)) != GoogleString::npos) {
00158 url_hash[pos] = '$';
00159 }
00160 return url_hash;
00161 }
00162
00163 private:
00164 void RewriteIfNecessary() {
00165 if (!rewritten_) {
00166 Rewrite();
00167 rewritten_ = true;
00168 }
00169 }
00170
00171 DISALLOW_COPY_AND_ASSIGN(JavascriptCodeBlock);
00172
00173 protected:
00174 void Rewrite();
00175
00176 JavascriptRewriteConfig* config_;
00177 const GoogleString message_id_;
00178 MessageHandler* handler_;
00179 const GoogleString original_code_;
00183 StringPiece output_code_;
00184 bool rewritten_;
00185 GoogleString rewritten_code_;
00186 };
00187
00188 }
00189
00190 #endif ///< NET_INSTAWEB_REWRITER_PUBLIC_JAVASCRIPT_CODE_BLOCK_H_