19 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_CSS_FILTER_H_
20 #define NET_INSTAWEB_REWRITER_PUBLIC_CSS_FILTER_H_
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"
50 namespace net_instaweb {
52 class AssociationTransformer;
54 class CssImageRewriter;
56 class ImageCombineFilter;
57 class ImageRewriteFilter;
59 class RewriteDomainTransformer;
88 static void InitStats(Statistics* statistics);
92 static void Terminate();
103 virtual void StartElementImpl(HtmlElement* element);
104 virtual void Characters(HtmlCharactersNode* characters);
105 virtual void EndElementImpl(HtmlElement* element);
107 virtual const char* Name()
const {
return "CssFilter"; }
108 virtual const char* id()
const {
return RewriteOptions::kCssFilterId; }
110 ResourceContext* context)
const;
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[];
128 const ResourcePtr& resource,
const GoogleString& location,
133 *num_filters = merged_filters_size_;
134 return merged_filters_;
137 return related_options_;
142 virtual const UrlSegmentEncoder*
encoder()
const;
147 friend class Context;
153 kAttributeWithoutUrls,
161 void StartInlineRewrite(HtmlCharactersNode* text);
165 void StartAttributeRewrite(HtmlElement* element,
166 HtmlElement::Attribute* style,
167 InlineCssKind inline_css_kind);
171 void StartExternalRewrite(HtmlElement* link, HtmlElement::Attribute* src);
173 ResourcePtr MakeInlineResource(StringPiece content);
181 bool GetApplicableCharset(
const HtmlElement* element,
182 GoogleString* charset,
183 GoogleString* failure_reason)
const;
187 bool GetApplicableMedia(
const HtmlElement* element,
188 StringVector* media)
const;
190 bool in_style_element_;
191 HtmlElement* style_element_;
195 GoogleString meta_tag_charset_;
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_;
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_;
246 static int merged_filters_size_;
249 static StringPieceVector* related_options_;
262 ResourceContext* context);
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);
281 StringPiece input_contents,
283 MessageHandler* handler);
287 CssHierarchy* mutable_hierarchy() {
return &hierarchy_; }
292 virtual bool Partition(OutputPartitions* partitions,
293 OutputResourceVector* outputs);
295 const OutputResourcePtr& output);
296 virtual const char*
id()
const {
return filter_->id(); }
299 virtual const UrlSegmentEncoder*
encoder()
const;
303 const ResourceContext* resource_context)
const;
306 void GetCssBaseUrlToUse(
const ResourcePtr& input_resource,
307 GoogleUrl* css_base_gurl_to_use);
309 void GetCssTrimUrlToUse(
const ResourcePtr& input_resource,
310 const StringPiece& output_url_base,
311 GoogleUrl* css_base_gurl_to_use);
313 void GetCssTrimUrlToUse(
const ResourcePtr& input_resource,
314 const OutputResourcePtr& output_resource,
315 GoogleUrl* css_base_gurl_to_use);
317 bool RewriteCssText(
const GoogleUrl& css_base_gurl,
318 const GoogleUrl& css_trim_gurl,
319 const StringPiece& in_text,
321 bool text_is_declarations,
322 MessageHandler* handler);
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);
335 bool FallbackRewriteUrls(
const GoogleUrl& css_base_gurl,
336 const GoogleUrl& css_trim_gurl,
337 const StringPiece& in_text);
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,
348 GoogleString* out_text,
349 MessageHandler* handler);
354 bool IsInlineAttribute()
const {
355 return (rewrite_inline_attribute_ != NULL);
361 int64 ImageInlineMaxBytes()
const;
363 virtual bool ScheduleViaCentralController() {
return true; }
366 scoped_ptr<CssImageRewriter> css_image_rewriter_;
367 ImageRewriteFilter* image_rewrite_filter_;
368 CssResourceSlotFactory slot_factory_;
377 scoped_ptr<AssociationTransformer> fallback_transformer_;
380 scoped_ptr<RewriteDomainTransformer> absolutifier_;
384 HtmlElement* rewrite_element_;
389 HtmlElement* rewrite_inline_element_;
392 HtmlCharactersNode* rewrite_inline_char_node_;
397 HtmlElement::Attribute* rewrite_inline_attribute_;
402 InlineCssKind rewrite_inline_css_kind_;
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_;
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.