Page Speed Optimization Libraries  1.9.32.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
css_filter.h
Go to the documentation of this file.
1 /*
2  * Copyright 2010 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http:///www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
18 
19 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_CSS_FILTER_H_
20 #define NET_INSTAWEB_REWRITER_PUBLIC_CSS_FILTER_H_
21 
22 #include "net/instaweb/htmlparse/public/html_element.h"
34 #include "net/instaweb/util/public/google_url.h"
38 
39 namespace Css {
40 
41 class Stylesheet;
42 
43 }
44 
45 namespace net_instaweb {
46 
47 class AssociationTransformer;
48 class AsyncFetch;
49 class CssImageRewriter;
50 class CacheExtender;
51 class HtmlCharactersNode;
52 class ImageCombineFilter;
53 class ImageRewriteFilter;
54 class MessageHandler;
55 class OutputPartitions;
56 class ResourceContext;
57 class RewriteContext;
58 class RewriteDriver;
59 class RewriteDomainTransformer;
60 class Statistics;
61 class UpDownCounter;
62 class UrlSegmentEncoder;
63 class Variable;
64 
75 class CssFilter : public RewriteFilter {
76  public:
77  class Context;
78 
79  CssFilter(RewriteDriver* driver,
82  CacheExtender* cache_extender,
83  ImageRewriteFilter* image_rewriter,
84  ImageCombineFilter* image_combiner);
85  virtual ~CssFilter();
86 
89  static void InitStats(Statistics* statistics);
90 
92  static void Initialize();
93  static void Terminate();
94 
96  static void AddRelatedOptions(StringPieceVector* target);
97 
101  static void InitializeAtExitManager();
102 
103  virtual void StartDocumentImpl();
104  virtual void StartElementImpl(HtmlElement* element);
105  virtual void Characters(HtmlCharactersNode* characters);
106  virtual void EndElementImpl(HtmlElement* element);
107 
108  virtual const char* Name() const { return "CssFilter"; }
109  virtual const char* id() const { return RewriteOptions::kCssFilterId; }
111  ResourceContext* context) const;
112 
113  static const char kBlocksRewritten[];
114  static const char kParseFailures[];
115  static const char kFallbackRewrites[];
116  static const char kFallbackFailures[];
117  static const char kRewritesDropped[];
118  static const char kTotalBytesSaved[];
119  static const char kTotalOriginalBytes[];
120  static const char kUses[];
121  static const char kCharsetMismatch[];
122  static const char kInvalidUrl[];
123  static const char kLimitExceeded[];
124  static const char kMinifyFailed[];
125  static const char kRecursion[];
126  static const char kComplexQueries[];
127 
128  RewriteContext* MakeNestedFlatteningContextInNewSlot(
129  const ResourcePtr& resource, const GoogleString& location,
130  CssFilter::Context* rewriter, RewriteContext* parent,
131  CssHierarchy* hierarchy);
132 
133  virtual const RewriteOptions::Filter* RelatedFilters(int* num_filters) const {
134  *num_filters = merged_filters_size_;
135  return merged_filters_;
136  }
137  virtual const StringPieceVector* RelatedOptions() const {
138  return related_options_;
139  }
140 
141  protected:
143  virtual const UrlSegmentEncoder* encoder() const;
145  RewriteContext* parent, const ResourceSlotPtr& slot);
146 
147  private:
148  friend class Context;
150  friend class CssHierarchy;
151 
152  enum InlineCssKind {
153  kInsideStyleTag,
154  kAttributeWithoutUrls,
155  kAttributeWithUrls
156  };
157 
158  Context* MakeContext(RewriteDriver* driver,
159  RewriteContext* parent);
160 
162  void StartInlineRewrite(HtmlCharactersNode* text);
163 
166  void StartAttributeRewrite(HtmlElement* element,
167  HtmlElement::Attribute* style,
168  InlineCssKind inline_css_kind);
169 
172  void StartExternalRewrite(HtmlElement* link, HtmlElement::Attribute* src);
173 
174  ResourceSlot* MakeSlotForInlineCss(HtmlElement* element,
175  const StringPiece& content);
176  CssFilter::Context* StartRewriting(const ResourceSlotPtr& slot);
177 
183  bool GetApplicableCharset(const HtmlElement* element,
184  GoogleString* charset,
185  GoogleString* failure_reason) const;
186 
189  bool GetApplicableMedia(const HtmlElement* element,
190  StringVector* media) const;
191 
192  bool in_style_element_;
193  HtmlElement* style_element_;
195 
197  GoogleString meta_tag_charset_;
198 
200  CacheExtender* cache_extender_;
201  ImageRewriteFilter* image_rewrite_filter_;
202  ImageCombineFilter* image_combiner_;
203 
207  Variable* num_blocks_rewritten_;
209  Variable* num_parse_failures_;
212  Variable* num_fallback_rewrites_;
214  Variable* num_fallback_failures_;
217  Variable* num_rewrites_dropped_;
223  UpDownCounter* total_bytes_saved_;
227  Variable* total_original_bytes_;
230  Variable* num_uses_;
232  Variable* num_flatten_imports_charset_mismatch_;
234  Variable* num_flatten_imports_invalid_url_;
236  Variable* num_flatten_imports_limit_exceeded_;
238  Variable* num_flatten_imports_minify_failed_;
240  Variable* num_flatten_imports_recursion_;
242  Variable* num_flatten_imports_complex_queries_;
243 
244  CssUrlEncoder encoder_;
245 
247  static const RewriteOptions::Filter* merged_filters_;
248  static int merged_filters_size_;
249 
251  static StringPieceVector* related_options_;
252 
253  DISALLOW_COPY_AND_ASSIGN(CssFilter);
254 };
255 
258  public:
259  Context(CssFilter* filter, RewriteDriver* driver,
261  CacheExtender* cache_extender,
262  ImageRewriteFilter* image_rewriter,
263  ImageCombineFilter* image_combiner,
264  ResourceContext* context);
265  virtual ~Context();
266 
268  void SetupInlineRewrite(HtmlElement* style_element, HtmlCharactersNode* text);
269  void SetupAttributeRewrite(HtmlElement* element,
270  HtmlElement::Attribute* src,
271  InlineCssKind inline_css_kind);
272  void SetupExternalRewrite(HtmlElement* element,
273  const GoogleUrl& base_gurl,
274  const GoogleUrl& trim_gurl);
275 
278  void RewriteCssFromNested(RewriteContext* parent, CssHierarchy* hierarchy);
279 
282  virtual bool SendFallbackResponse(StringPiece output_url_base,
283  StringPiece input_contents,
285  MessageHandler* handler);
286 
287  CssResourceSlotFactory* slot_factory() { return &slot_factory_; }
288 
289  CssHierarchy* mutable_hierarchy() { return &hierarchy_; }
290 
291  protected:
292  virtual void Render();
293  virtual void Harvest();
294  virtual bool Partition(OutputPartitions* partitions,
295  OutputResourceVector* outputs);
296  virtual void RewriteSingle(const ResourcePtr& input,
297  const OutputResourcePtr& output);
298  virtual const char* id() const { return filter_->id(); }
299  virtual OutputResourceKind kind() const { return kRewrittenResource; }
300  virtual GoogleString CacheKeySuffix() const;
301  virtual const UrlSegmentEncoder* encoder() const;
302 
304  virtual GoogleString UserAgentCacheKey(
305  const ResourceContext* resource_context) const;
306 
307  private:
308  void GetCssBaseUrlToUse(const ResourcePtr& input_resource,
309  GoogleUrl* css_base_gurl_to_use);
310 
311  void GetCssTrimUrlToUse(const ResourcePtr& input_resource,
312  const StringPiece& output_url_base,
313  GoogleUrl* css_base_gurl_to_use);
314 
315  void GetCssTrimUrlToUse(const ResourcePtr& input_resource,
316  const OutputResourcePtr& output_resource,
317  GoogleUrl* css_base_gurl_to_use);
318 
319  bool RewriteCssText(const GoogleUrl& css_base_gurl,
320  const GoogleUrl& css_trim_gurl,
321  const StringPiece& in_text,
322  int64 in_text_size,
323  bool text_is_declarations,
324  MessageHandler* handler);
325 
327  void RewriteCssFromRoot(const GoogleUrl& css_base_gurl,
328  const GoogleUrl& css_trim_gurl,
329  const StringPiece& in_text, int64 in_text_size,
330  bool has_unparseables, Css::Stylesheet* stylesheet);
331 
337  bool FallbackRewriteUrls(const GoogleUrl& css_base_gurl,
338  const GoogleUrl& css_trim_gurl,
339  const StringPiece& in_text);
340 
343  bool SerializeCss(int64 in_text_size,
344  const Css::Stylesheet* stylesheet,
345  const GoogleUrl& css_base_gurl,
346  const GoogleUrl& css_trim_gurl,
347  bool previously_optimized,
348  bool stylesheet_is_declarations,
349  bool add_utf8_bom,
350  GoogleString* out_text,
351  MessageHandler* handler);
352 
356  bool IsInlineAttribute() const {
357  return (rewrite_inline_attribute_ != NULL);
358  }
359 
363  int64 ImageInlineMaxBytes() const;
364 
365  CssFilter* filter_;
366  scoped_ptr<CssImageRewriter> css_image_rewriter_;
367  CssResourceSlotFactory slot_factory_;
368  CssHierarchy hierarchy_;
369  bool css_rewritten_;
370  bool has_utf8_bom_;
371 
373  bool fallback_mode_;
376  scoped_ptr<AssociationTransformer> fallback_transformer_;
379  scoped_ptr<RewriteDomainTransformer> absolutifier_;
380 
383  HtmlElement* rewrite_element_;
384 
388  HtmlElement* rewrite_inline_element_;
389 
391  HtmlCharactersNode* rewrite_inline_char_node_;
392 
396  HtmlElement::Attribute* rewrite_inline_attribute_;
397 
401  InlineCssKind rewrite_inline_css_kind_;
402 
404  int64 in_text_size_;
405  GoogleUrl initial_css_base_gurl_;
406  GoogleUrl initial_css_trim_gurl_;
407  scoped_ptr<GoogleUrl> base_gurl_for_fallback_;
408  scoped_ptr<GoogleUrl> trim_gurl_for_fallback_;
409  ResourcePtr input_resource_;
410  OutputResourcePtr output_resource_;
411 
412  DISALLOW_COPY_AND_ASSIGN(Context);
413 };
414 
415 }
416 
417 #endif
RewriteContext * parent()
Allows a nested rewriter to walk up its parent hierarchy.
Definition: rewrite_context.h:266
Context used by CssFilter under async flow.
Definition: css_filter.h:257
static void AddRelatedOptions(StringPieceVector *target)
Add this filters related options to the given vector.
virtual GoogleString CacheKeySuffix() const
virtual GoogleString UserAgentCacheKey(const ResourceContext *resource_context) const
Implements UserAgentCacheKey method of RewriteContext.
Definition: css_resource_slot.h:83
virtual OutputResourceKind kind() const
Definition: css_filter.h:299
Definition: css_hierarchy.h:64
Definition: resource_slot.h:53
static void InitStats(Statistics *statistics)
Context used by CssFilter under async flow that flattens .
Definition: css_flatten_imports_context.h:48
static void InitializeAtExitManager()
virtual const StringPieceVector * RelatedOptions() const
Definition: css_filter.h:137
virtual const UrlSegmentEncoder * encoder() const
virtual void StartDocumentImpl()
virtual RewriteContext * MakeRewriteContext()
virtual const RewriteOptions::Filter * RelatedFilters(int *num_filters) const
Definition: css_filter.h:133
virtual RewriteContext * MakeNestedRewriteContext(RewriteContext *parent, const ResourceSlotPtr &slot)
Definition: async_fetch.h:53
virtual bool Partition(OutputPartitions *partitions, OutputResourceVector *outputs)
SingleRewriteContext takes care of these methods from RewriteContext:
Definition: rewrite_filter.h:37
Filter
Definition: rewrite_options.h:104
Definition: rewrite_driver.h:98
Definition: rewrite_context.h:144
Definition: image_rewrite_filter.h:65
derived from some input resource URL or URLs.
Definition: output_resource_kind.h:27
virtual const char * id() const
Returns the filter ID.
Definition: css_filter.h:298
CssFilter(RewriteDriver *driver, CacheExtender *cache_extender, ImageRewriteFilter *image_rewriter, ImageCombineFilter *image_combiner)
Definition: single_rewrite_context.h:36
virtual const UrlSegmentEncoder * encoder() const
void SetupInlineRewrite(HtmlElement *style_element, HtmlCharactersNode *text)
Setup rewriting for inline, attribute, or external CSS.
static void Initialize()
Initialize & Terminate must be paired.
Definition: image_combine_filter.h:58
Definition: css_url_encoder.h:49
void RewriteCssFromNested(RewriteContext *parent, CssHierarchy *hierarchy)
virtual void EncodeUserAgentIntoResourceContext(ResourceContext *context) const
Definition: cache_extender.h:49
Definition: css_filter.h:75
virtual void Characters(HtmlCharactersNode *characters)
virtual bool SendFallbackResponse(StringPiece output_url_base, StringPiece input_contents, AsyncFetch *async_fetch, MessageHandler *handler)
virtual void RewriteSingle(const ResourcePtr &input, const OutputResourcePtr &output)
Subclasses of SingleRewriteContext must override this:
OutputResourceKind
Definition: output_resource_kind.h:26
AsyncFetch * async_fetch()
Note that the following must only be called in the fetch flow.