Page Speed Optimization Libraries  1.11.33.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends 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/rewriter/cached_result.pb.h"
35 #include "pagespeed/kernel/base/basictypes.h"
36 #include "pagespeed/kernel/base/scoped_ptr.h"
37 #include "pagespeed/kernel/base/string.h"
38 #include "pagespeed/kernel/base/string_util.h"
39 #include "pagespeed/kernel/html/html_element.h"
40 #include "pagespeed/kernel/html/html_node.h"
41 #include "pagespeed/kernel/http/google_url.h"
42 #include "pagespeed/kernel/util/url_segment_encoder.h"
43 
44 namespace Css {
45 
46 class Stylesheet;
47 
48 }
49 
50 namespace net_instaweb {
51 
52 class AssociationTransformer;
53 class AsyncFetch;
54 class CssImageRewriter;
55 class CacheExtender;
56 class ImageCombineFilter;
57 class ImageRewriteFilter;
58 class MessageHandler;
59 class RewriteDomainTransformer;
60 class Statistics;
61 class UpDownCounter;
62 class Variable;
63 
74 class CssFilter : public RewriteFilter {
75  public:
76  class Context;
77 
78  CssFilter(RewriteDriver* driver,
81  CacheExtender* cache_extender,
82  ImageRewriteFilter* image_rewriter,
83  ImageCombineFilter* image_combiner);
84  virtual ~CssFilter();
85 
88  static void InitStats(Statistics* statistics);
89 
91  static void Initialize();
92  static void Terminate();
93 
95  static void AddRelatedOptions(StringPieceVector* target);
96 
100  static void InitializeAtExitManager();
101 
102  virtual void StartDocumentImpl();
103  virtual void StartElementImpl(HtmlElement* element);
104  virtual void Characters(HtmlCharactersNode* characters);
105  virtual void EndElementImpl(HtmlElement* element);
106 
107  virtual const char* Name() const { return "CssFilter"; }
108  virtual const char* id() const { return RewriteOptions::kCssFilterId; }
110  ResourceContext* context) const;
111 
112  static const char kBlocksRewritten[];
113  static const char kParseFailures[];
114  static const char kFallbackRewrites[];
115  static const char kFallbackFailures[];
116  static const char kRewritesDropped[];
117  static const char kTotalBytesSaved[];
118  static const char kTotalOriginalBytes[];
119  static const char kUses[];
120  static const char kCharsetMismatch[];
121  static const char kInvalidUrl[];
122  static const char kLimitExceeded[];
123  static const char kMinifyFailed[];
124  static const char kRecursion[];
125  static const char kComplexQueries[];
126 
127  RewriteContext* MakeNestedFlatteningContextInNewSlot(
128  const ResourcePtr& resource, const GoogleString& location,
129  CssFilter::Context* rewriter, RewriteContext* parent,
130  CssHierarchy* hierarchy);
131 
132  virtual const RewriteOptions::Filter* RelatedFilters(int* num_filters) const {
133  *num_filters = merged_filters_size_;
134  return merged_filters_;
135  }
136  virtual const StringPieceVector* RelatedOptions() const {
137  return related_options_;
138  }
139 
140  protected:
142  virtual const UrlSegmentEncoder* encoder() const;
144  RewriteContext* parent, const ResourceSlotPtr& slot);
145 
146  private:
147  friend class Context;
149  friend class CssHierarchy;
150 
151  enum InlineCssKind {
152  kInsideStyleTag,
153  kAttributeWithoutUrls,
154  kAttributeWithUrls
155  };
156 
157  Context* MakeContext(RewriteDriver* driver,
158  RewriteContext* parent);
159 
161  void StartInlineRewrite(HtmlCharactersNode* text);
162 
165  void StartAttributeRewrite(HtmlElement* element,
166  HtmlElement::Attribute* style,
167  InlineCssKind inline_css_kind);
168 
171  void StartExternalRewrite(HtmlElement* link, HtmlElement::Attribute* src);
172 
173  ResourcePtr MakeInlineResource(StringPiece content);
174  CssFilter::Context* StartRewriting(const ResourceSlotPtr& slot);
175 
181  bool GetApplicableCharset(const HtmlElement* element,
182  GoogleString* charset,
183  GoogleString* failure_reason) const;
184 
187  bool GetApplicableMedia(const HtmlElement* element,
188  StringVector* media) const;
189 
190  bool in_style_element_;
191  HtmlElement* style_element_;
193 
195  GoogleString meta_tag_charset_;
196 
198  CacheExtender* cache_extender_;
199  ImageRewriteFilter* image_rewrite_filter_;
200  ImageCombineFilter* image_combiner_;
201 
205  Variable* num_blocks_rewritten_;
207  Variable* num_parse_failures_;
210  Variable* num_fallback_rewrites_;
212  Variable* num_fallback_failures_;
215  Variable* num_rewrites_dropped_;
221  UpDownCounter* total_bytes_saved_;
225  Variable* total_original_bytes_;
228  Variable* num_uses_;
230  Variable* num_flatten_imports_charset_mismatch_;
232  Variable* num_flatten_imports_invalid_url_;
234  Variable* num_flatten_imports_limit_exceeded_;
236  Variable* num_flatten_imports_minify_failed_;
238  Variable* num_flatten_imports_recursion_;
240  Variable* num_flatten_imports_complex_queries_;
241 
242  CssUrlEncoder encoder_;
243 
245  static const RewriteOptions::Filter* merged_filters_;
246  static int merged_filters_size_;
247 
249  static StringPieceVector* related_options_;
250 
251 
252 };
253 
256  public:
257  Context(CssFilter* filter, RewriteDriver* driver,
259  CacheExtender* cache_extender,
260  ImageRewriteFilter* image_rewriter,
261  ImageCombineFilter* image_combiner,
262  ResourceContext* context);
263  virtual ~Context();
264 
266  void SetupInlineRewrite(HtmlElement* style_element, HtmlCharactersNode* text);
267  void SetupAttributeRewrite(HtmlElement* element,
268  HtmlElement::Attribute* src,
269  InlineCssKind inline_css_kind);
270  void SetupExternalRewrite(HtmlElement* element,
271  const GoogleUrl& base_gurl,
272  const GoogleUrl& trim_gurl);
273 
276  void RewriteCssFromNested(RewriteContext* parent, CssHierarchy* hierarchy);
277 
280  virtual bool SendFallbackResponse(StringPiece output_url_base,
281  StringPiece input_contents,
283  MessageHandler* handler);
284 
285  CssResourceSlotFactory* slot_factory() { return &slot_factory_; }
286 
287  CssHierarchy* mutable_hierarchy() { return &hierarchy_; }
288 
289  protected:
290  virtual void Render();
291  virtual void Harvest();
292  virtual bool Partition(OutputPartitions* partitions,
293  OutputResourceVector* outputs);
294  virtual void RewriteSingle(const ResourcePtr& input,
295  const OutputResourcePtr& output);
296  virtual const char* id() const { return filter_->id(); }
297  virtual OutputResourceKind kind() const { return kRewrittenResource; }
298  virtual GoogleString CacheKeySuffix() const;
299  virtual const UrlSegmentEncoder* encoder() const;
300 
302  virtual GoogleString UserAgentCacheKey(
303  const ResourceContext* resource_context) const;
304 
305  private:
306  void GetCssBaseUrlToUse(const ResourcePtr& input_resource,
307  GoogleUrl* css_base_gurl_to_use);
308 
309  void GetCssTrimUrlToUse(const ResourcePtr& input_resource,
310  const StringPiece& output_url_base,
311  GoogleUrl* css_base_gurl_to_use);
312 
313  void GetCssTrimUrlToUse(const ResourcePtr& input_resource,
314  const OutputResourcePtr& output_resource,
315  GoogleUrl* css_base_gurl_to_use);
316 
317  bool RewriteCssText(const GoogleUrl& css_base_gurl,
318  const GoogleUrl& css_trim_gurl,
319  const StringPiece& in_text,
320  int64 in_text_size,
321  bool text_is_declarations,
322  MessageHandler* handler);
323 
325  void RewriteCssFromRoot(const GoogleUrl& css_base_gurl,
326  const GoogleUrl& css_trim_gurl,
327  const StringPiece& in_text, int64 in_text_size,
328  bool has_unparseables, Css::Stylesheet* stylesheet);
329 
335  bool FallbackRewriteUrls(const GoogleUrl& css_base_gurl,
336  const GoogleUrl& css_trim_gurl,
337  const StringPiece& in_text);
338 
341  bool SerializeCss(int64 in_text_size,
342  const Css::Stylesheet* stylesheet,
343  const GoogleUrl& css_base_gurl,
344  const GoogleUrl& css_trim_gurl,
345  bool previously_optimized,
346  bool stylesheet_is_declarations,
347  bool add_utf8_bom,
348  GoogleString* out_text,
349  MessageHandler* handler);
350 
354  bool IsInlineAttribute() const {
355  return (rewrite_inline_attribute_ != NULL);
356  }
357 
361  int64 ImageInlineMaxBytes() const;
362 
363  virtual bool ScheduleViaCentralController() { return true; }
364 
365  CssFilter* filter_;
366  scoped_ptr<CssImageRewriter> css_image_rewriter_;
367  ImageRewriteFilter* image_rewrite_filter_;
368  CssResourceSlotFactory slot_factory_;
369  CssHierarchy hierarchy_;
370  bool css_rewritten_;
371  bool has_utf8_bom_;
372 
374  bool fallback_mode_;
377  scoped_ptr<AssociationTransformer> fallback_transformer_;
380  scoped_ptr<RewriteDomainTransformer> absolutifier_;
381 
384  HtmlElement* rewrite_element_;
385 
389  HtmlElement* rewrite_inline_element_;
390 
392  HtmlCharactersNode* rewrite_inline_char_node_;
393 
397  HtmlElement::Attribute* rewrite_inline_attribute_;
398 
402  InlineCssKind rewrite_inline_css_kind_;
403 
405  int64 in_text_size_;
406  GoogleUrl initial_css_base_gurl_;
407  GoogleUrl initial_css_trim_gurl_;
408  scoped_ptr<GoogleUrl> base_gurl_for_fallback_;
409  scoped_ptr<GoogleUrl> trim_gurl_for_fallback_;
410  ResourcePtr input_resource_;
411  OutputResourcePtr output_resource_;
412 
413 
414 };
415 
416 }
417 
418 #endif
RewriteContext * parent()
Allows a nested rewriter to walk up its parent hierarchy.
Definition: rewrite_context.h:274
Context used by CssFilter under async flow.
Definition: css_filter.h:255
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:297
Definition: css_hierarchy.h:64
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:136
virtual const UrlSegmentEncoder * encoder() const
virtual void StartDocumentImpl()
virtual RewriteContext * MakeRewriteContext()
virtual const RewriteOptions::Filter * RelatedFilters(int *num_filters) const
Definition: css_filter.h:132
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:35
Filter
Definition: rewrite_options.h:107
Definition: rewrite_driver.h:98
Definition: rewrite_context.h:146
Definition: image_rewrite_filter.h:62
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:296
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:74
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:
friend class CssHierarchy
for statistics
Definition: css_filter.h:149
OutputResourceKind
Definition: output_resource_kind.h:26
AsyncFetch * async_fetch()
Note that the following must only be called in the fetch flow.