Page Speed Optimization Libraries
1.8.31.2
|
00001 /* 00002 * Copyright 2013 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_CSS_SUMMARIZER_BASE_H_ 00020 #define NET_INSTAWEB_REWRITER_PUBLIC_CSS_SUMMARIZER_BASE_H_ 00021 00022 #include <vector> 00023 00024 #include "net/instaweb/htmlparse/public/html_element.h" 00025 #include "net/instaweb/rewriter/public/resource_slot.h" 00026 #include "net/instaweb/rewriter/public/rewrite_filter.h" 00027 #include "net/instaweb/util/public/basictypes.h" 00028 #include "net/instaweb/util/public/scoped_ptr.h" 00029 #include "net/instaweb/util/public/string.h" 00030 #include "net/instaweb/util/public/string_util.h" 00031 00032 namespace Css { 00033 00034 class Stylesheet; 00035 00036 } 00037 00038 namespace net_instaweb { 00039 00040 class AbstractMutex; 00041 class HtmlCharactersNode; 00042 class RewriteContext; 00043 class RewriteDriver; 00044 class Statistics; 00045 class Variable; 00046 00051 class CssSummarizerBase : public RewriteFilter { 00052 public: 00053 static const char kNumCssUsedForCriticalCssComputation[]; 00054 static const char kNumCssNotUsedForCriticalCssComputation[]; 00055 00056 explicit CssSummarizerBase(RewriteDriver* driver); 00057 virtual ~CssSummarizerBase(); 00058 00059 static void InitStats(Statistics* statistics); 00060 00061 protected: 00062 enum SummaryState { 00064 kSummaryOk, 00065 00067 kSummaryStillPending, 00068 00070 kSummaryCssParseError, 00071 00074 kSummaryResourceCreationFailed, 00075 00077 kSummaryInputUnavailable, 00078 00080 kSummarySlotRemoved, 00081 }; 00082 00083 struct SummaryInfo { 00084 SummaryInfo() 00085 : state(kSummaryStillPending), 00086 is_external(false), 00087 is_inside_noscript(false) {} 00088 00091 GoogleString data; 00092 00094 SummaryState state; 00095 00098 GoogleString location; 00099 00101 GoogleString base; 00102 00104 GoogleString media_from_html; 00105 00107 GoogleString rel; 00108 00110 bool is_external; 00111 00113 bool is_inside_noscript; 00114 }; 00115 00118 virtual GoogleString CacheKeySuffix() const; 00119 00124 virtual bool MustSummarize(HtmlElement* element) const { 00125 return true; 00126 } 00127 00135 virtual void Summarize(Css::Stylesheet* stylesheet, 00136 GoogleString* out) const = 0; 00137 00154 virtual void RenderSummary(int pos, 00155 HtmlElement* element, 00156 HtmlCharactersNode* char_node, 00157 bool* is_element_deleted); 00158 00167 virtual void WillNotRenderSummary(int pos, 00168 HtmlElement* element, 00169 HtmlCharactersNode* char_node, 00170 bool* is_element_deleted); 00171 00186 virtual void SummariesDone(); 00187 00192 int NumStyles() const { return static_cast<int>(summaries_.size()); } 00193 00199 const SummaryInfo& GetSummaryForStyle(int pos) const { 00200 return summaries_.at(pos); 00201 } 00202 00205 virtual void StartDocumentImpl(); 00206 virtual void EndDocument(); 00207 virtual void StartElementImpl(HtmlElement* element); 00208 virtual void Characters(HtmlCharactersNode* characters); 00209 virtual void EndElementImpl(HtmlElement* element); 00210 virtual void RenderDone(); 00211 00212 virtual RewriteContext* MakeRewriteContext(); 00213 00214 private: 00215 class Context; 00216 00218 void Clear(); 00219 00222 void ReportSummariesDone(); 00223 00226 void StartInlineRewrite(HtmlElement* style, HtmlCharactersNode* text); 00227 00230 void StartExternalRewrite(HtmlElement* link, HtmlElement::Attribute* src, 00231 StringPiece rel); 00232 00238 Context* CreateContextAndSummaryInfo(const HtmlElement* element, 00239 bool external, 00240 const ResourceSlotPtr& slot, 00241 const GoogleString& location, 00242 StringPiece base_for_resources, 00243 StringPiece rel); 00244 00245 ResourceSlot* MakeSlotForInlineCss(const StringPiece& content); 00246 00248 std::vector<SummaryInfo> summaries_; 00249 00250 scoped_ptr<AbstractMutex> progress_lock_; 00251 int outstanding_rewrites_; 00252 bool saw_end_of_document_; 00253 00254 00255 00256 std::vector<int> canceled_summaries_; 00257 00258 HtmlElement* style_element_; 00259 00260 Variable* num_css_used_for_critical_css_computation_; 00261 Variable* num_css_not_used_for_critical_css_computation_; 00262 00263 DISALLOW_COPY_AND_ASSIGN(CssSummarizerBase); 00264 }; 00265 00266 } 00267 00268 #endif ///< NET_INSTAWEB_REWRITER_PUBLIC_CSS_SUMMARIZER_BASE_H_