Page Speed Optimization Libraries  1.7.30.3
net/instaweb/rewriter/public/css_summarizer_base.h
Go to the documentation of this file.
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_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines