19 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_CSS_FILTER_H_
20 #define NET_INSTAWEB_REWRITER_PUBLIC_CSS_FILTER_H_
22 #include "net/instaweb/htmlparse/public/html_element.h"
34 #include "net/instaweb/util/public/google_url.h"
45 namespace net_instaweb {
47 class AssociationTransformer;
49 class CssImageRewriter;
51 class HtmlCharactersNode;
52 class ImageCombineFilter;
53 class ImageRewriteFilter;
55 class OutputPartitions;
56 class ResourceContext;
59 class RewriteDomainTransformer;
62 class UrlSegmentEncoder;
89 static void InitStats(Statistics* statistics);
93 static void Terminate();
104 virtual void StartElementImpl(HtmlElement* element);
105 virtual void Characters(HtmlCharactersNode* characters);
106 virtual void EndElementImpl(HtmlElement* element);
108 virtual const char* Name()
const {
return "CssFilter"; }
109 virtual const char* id()
const {
return RewriteOptions::kCssFilterId; }
111 ResourceContext* context)
const;
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[];
129 const ResourcePtr& resource,
const GoogleString& location,
134 *num_filters = merged_filters_size_;
135 return merged_filters_;
138 return related_options_;
143 virtual const UrlSegmentEncoder*
encoder()
const;
148 friend class Context;
154 kAttributeWithoutUrls,
162 void StartInlineRewrite(HtmlCharactersNode* text);
166 void StartAttributeRewrite(HtmlElement* element,
167 HtmlElement::Attribute* style,
168 InlineCssKind inline_css_kind);
172 void StartExternalRewrite(HtmlElement* link, HtmlElement::Attribute* src);
174 ResourceSlot* MakeSlotForInlineCss(HtmlElement* element,
175 const StringPiece& content);
183 bool GetApplicableCharset(
const HtmlElement* element,
184 GoogleString* charset,
185 GoogleString* failure_reason)
const;
189 bool GetApplicableMedia(
const HtmlElement* element,
190 StringVector* media)
const;
192 bool in_style_element_;
193 HtmlElement* style_element_;
197 GoogleString meta_tag_charset_;
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_;
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_;
248 static int merged_filters_size_;
251 static StringPieceVector* related_options_;
264 ResourceContext* context);
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);
283 StringPiece input_contents,
285 MessageHandler* handler);
289 CssHierarchy* mutable_hierarchy() {
return &hierarchy_; }
294 virtual bool Partition(OutputPartitions* partitions,
295 OutputResourceVector* outputs);
297 const OutputResourcePtr& output);
298 virtual const char*
id()
const {
return filter_->id(); }
301 virtual const UrlSegmentEncoder*
encoder()
const;
305 const ResourceContext* resource_context)
const;
308 void GetCssBaseUrlToUse(
const ResourcePtr& input_resource,
309 GoogleUrl* css_base_gurl_to_use);
311 void GetCssTrimUrlToUse(
const ResourcePtr& input_resource,
312 const StringPiece& output_url_base,
313 GoogleUrl* css_base_gurl_to_use);
315 void GetCssTrimUrlToUse(
const ResourcePtr& input_resource,
316 const OutputResourcePtr& output_resource,
317 GoogleUrl* css_base_gurl_to_use);
319 bool RewriteCssText(
const GoogleUrl& css_base_gurl,
320 const GoogleUrl& css_trim_gurl,
321 const StringPiece& in_text,
323 bool text_is_declarations,
324 MessageHandler* handler);
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);
337 bool FallbackRewriteUrls(
const GoogleUrl& css_base_gurl,
338 const GoogleUrl& css_trim_gurl,
339 const StringPiece& in_text);
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,
350 GoogleString* out_text,
351 MessageHandler* handler);
356 bool IsInlineAttribute()
const {
357 return (rewrite_inline_attribute_ != NULL);
363 int64 ImageInlineMaxBytes()
const;
366 scoped_ptr<CssImageRewriter> css_image_rewriter_;
376 scoped_ptr<AssociationTransformer> fallback_transformer_;
379 scoped_ptr<RewriteDomainTransformer> absolutifier_;
383 HtmlElement* rewrite_element_;
388 HtmlElement* rewrite_inline_element_;
391 HtmlCharactersNode* rewrite_inline_char_node_;
396 HtmlElement::Attribute* rewrite_inline_attribute_;
401 InlineCssKind rewrite_inline_css_kind_;
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_;
412 DISALLOW_COPY_AND_ASSIGN(Context);
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.