19 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_IMAGE_REWRITE_FILTER_H_
20 #define NET_INSTAWEB_REWRITER_PUBLIC_IMAGE_REWRITE_FILTER_H_
24 #include "net/instaweb/rewriter/cached_result.pb.h"
35 #include "pagespeed/kernel/base/basictypes.h"
36 #include "pagespeed/kernel/base/printf_format.h"
37 #include "pagespeed/kernel/base/statistics.h"
38 #include "pagespeed/kernel/base/string.h"
39 #include "pagespeed/kernel/base/string_util.h"
40 #include "pagespeed/kernel/html/html_element.h"
41 #include "pagespeed/kernel/http/content_type.h"
42 #include "pagespeed/kernel/http/image_types.pb.h"
43 #include "pagespeed/kernel/util/url_segment_encoder.h"
45 namespace net_instaweb {
49 INLINE_UNSUPPORTED_DEVICE,
53 INLINE_CACHE_SMALL_IMAGES_UNREWRITTEN,
56 INLINE_INTERNAL_ERROR,
64 typedef std::map<GoogleString, AssociatedImageInfo> AssociatedImageInfoMap;
68 static const char kImageOngoingRewrites[];
69 static const char kImageResizedUsingRenderedDimensions[];
70 static const char kImageRewriteLatencyFailedMs[];
71 static const char kImageRewriteLatencyOkMs[];
72 static const char kImageRewriteLatencyTotalMs[];
73 static const char kImageRewritesDroppedDecodeFailure[];
74 static const char kImageRewritesDroppedDueToLoad[];
75 static const char kImageRewritesDroppedMIMETypeUnknown[];
76 static const char kImageRewritesDroppedNoSavingNoResize[];
77 static const char kImageRewritesDroppedNoSavingResize[];
78 static const char kImageRewritesDroppedServerWriteFail[];
79 static const char kImageRewritesSquashingForMobileScreen[];
80 static const char kImageRewrites[];
81 static const char kImageWebpRewrites[];
82 static const char kImageWebpFromGifFailureMs[];
83 static const char kImageWebpFromGifSuccessMs[];
84 static const char kImageWebpFromGifTimeouts[];
85 static const char kImageWebpFromJpegFailureMs[];
86 static const char kImageWebpFromJpegSuccessMs[];
87 static const char kImageWebpFromJpegTimeouts[];
88 static const char kImageWebpFromPngFailureMs[];
89 static const char kImageWebpFromPngSuccessMs[];
90 static const char kImageWebpFromPngTimeouts[];
91 static const char kImageWebpOpaqueFailureMs[];
92 static const char kImageWebpOpaqueSuccessMs[];
93 static const char kImageWebpOpaqueTimeouts[];
94 static const char kImageWebpWithAlphaFailureMs[];
95 static const char kImageWebpWithAlphaSuccessMs[];
96 static const char kImageWebpWithAlphaTimeouts[];
97 static const char kImageWebpFromGifAnimatedFailureMs[];
98 static const char kImageWebpFromGifAnimatedSuccessMs[];
99 static const char kImageWebpFromGifAnimatedTimeouts[];
107 static const int kRelatedFiltersSize;
111 static void InitStats(Statistics* statistics);
112 static void Initialize();
113 static void Terminate();
114 static void AddRelatedOptions(StringPieceVector* target);
116 virtual void EndDocument();
117 virtual void RenderDone();
118 virtual void StartElementImpl(HtmlElement* element) {}
119 virtual void EndElementImpl(HtmlElement* element);
120 virtual const char* Name()
const {
return "ImageRewrite"; }
121 virtual const char* id()
const {
return RewriteOptions::kImageCompressionId; }
123 ResourceContext* context)
const;
136 RewriteContext* context,
137 AssociatedImageInfo* out);
142 int64 image_inline_max_bytes,
const CachedResult* cached_result,
143 ResourceSlot* slot, GoogleString* data_url);
170 int64 css_image_inline_max_bytes,
171 RewriteContext* parent,
172 const ResourceSlotPtr& slot);
177 const ResourceSlotPtr& slot);
182 const ImageDim& image_dim,
const ResourceContext& resource_context,
183 ImageDim* desired_dim);
189 const GoogleString& url,
191 ImageDim* desired_dimensions);
196 const RewriteContext* rewrite_context,
const GoogleString& url,
197 ResourceContext* context, Image* image, CachedResult* cached);
202 const ResourceContext& context,
const ResourcePtr& input_resource);
206 return related_options_;
216 virtual const UrlSegmentEncoder*
encoder()
const;
222 friend class Context;
225 void InfoAndTrace(Context* context,
const char* format, ...)
226 INSTAWEB_PRINTF_FORMAT(3, 4);
227 const ContentType* ImageToContentType(const GoogleString& origin_url,
229 void BeginRewriteImageUrl(HtmlElement* element, HtmlElement::Attribute* src);
232 const ResourcePtr& input_resource,
233 const OutputResourcePtr& result);
236 bool FinishRewriteCssImageUrl(
237 int64 css_image_inline_max_bytes,
242 bool FinishRewriteImageUrl(
243 const CachedResult* cached, const ResourceContext* resource_context,
244 HtmlElement* element, HtmlElement::Attribute* src,
int image_index,
248 void SaveIfInlinable(const StringPiece& contents,
249 const ImageType image_type,
250 CachedResult* cached);
257 const HtmlElement::Attribute* src,
258 bool* is_resized_using_rendered_dimensions);
262 bool HasAnyDimensions(HtmlElement* element);
266 void ResizeLowQualityImage(
267 Image* low_image, const ResourcePtr& input_resource,
268 CachedResult* cached);
274 bool IsHtmlCriticalImage(StringPiece image_url) const;
279 bool StoreUrlInPropertyCache(const StringPiece& url);
281 void SaveDebugMessageToCache(const GoogleString& message,
282 Context* rewrite_context,
283 CachedResult* cached_result);
288 Variable* image_rewrites_;
290 Variable* image_resized_using_rendered_dimensions_;
292 Variable* image_norewrites_high_resolution_;
297 Variable* image_rewrites_dropped_intentionally_;
299 Variable* image_rewrites_dropped_decode_failure_;
301 Variable* image_rewrites_dropped_mime_type_unknown_;
304 Variable* image_rewrites_dropped_server_write_fail_;
307 Variable* image_rewrites_dropped_nosaving_resize_;
310 Variable* image_rewrites_dropped_nosaving_noresize_;
312 TimedVariable* image_rewrites_dropped_due_to_load_;
316 TimedVariable* image_rewrites_squashing_for_mobile_screen_;
320 Variable* image_rewrite_total_bytes_saved_;
324 Variable* image_rewrite_total_original_bytes_;
327 Variable* image_rewrite_uses_;
329 Variable* image_inline_count_;
331 Variable* image_webp_rewrites_;
333 UpDownCounter* image_ongoing_rewrites_;
336 Variable* image_rewrite_latency_total_ms_;
338 Histogram* image_rewrite_latency_ok_ms_;
340 Histogram* image_rewrite_latency_failed_ms_;
351 StringSet inlinable_urls_;
354 Image::ConversionVariables webp_conversion_variables_;
357 static StringPieceVector* related_options_;
359 std::map<GoogleString, AssociatedImageInfo> image_info_;
361 bool saw_end_document_;
InlineResult
Definition: image_rewrite_filter.h:47
void ReportDroppedRewrite()
Update stats for a rewrite dropped due to load.
RewriteContext * MakeNestedRewriteContextForCss(int64 css_image_inline_max_bytes, RewriteContext *parent, const ResourceSlotPtr &slot)
virtual RewriteContext * MakeRewriteContext()
virtual void EncodeUserAgentIntoResourceContext(ResourceContext *context) const
InlineResult TryInline(bool is_html, bool is_critical, int64 image_inline_max_bytes, const CachedResult *cached_result, ResourceSlot *slot, GoogleString *data_url)
virtual void StartDocumentImpl()
Definition: resource_slot.h:53
bool UpdateDesiredImageDimsIfNecessary(const ImageDim &image_dim, const ResourceContext &resource_context, ImageDim *desired_dim)
static bool ParseDimensionAttribute(const char *position, int *value)
DimensionState GetDimensions(Css::Declarations *decls, int *width, int *height)
Definition: resource_slot.h:240
Image::CompressionOptions * ImageOptionsForLoadedResource(const ResourceContext &context, const ResourcePtr &input_resource)
static void DisableRelatedFilters(RewriteOptions *options)
Disable all filters listed in kRelatedFilters in options.
virtual RewriteContext * MakeNestedRewriteContext(RewriteContext *parent, const ResourceSlotPtr &slot)
bool ResizeImageIfNecessary(const RewriteContext *rewrite_context, const GoogleString &url, ResourceContext *context, Image *image, CachedResult *cached)
Definition: rewrite_filter.h:35
virtual const StringPieceVector * RelatedOptions() const
Definition: image_rewrite_filter.h:205
Filter
Definition: rewrite_options.h:107
Definition: rewrite_driver.h:98
virtual const UrlSegmentEncoder * encoder() const
Image should not be inlined because it is part of a responsive image.
Definition: image_rewrite_filter.h:55
RewriteResult
Definition: rewrite_result.h:27
void RegisterImageInfo(const AssociatedImageInfo &image_info)
virtual const RewriteOptions::Filter * RelatedFilters(int *num_filters) const
Definition: rewrite_context.h:146
static const char kInlinableImageUrlsPropertyName[]
Definition: image_rewrite_filter.h:104
Definition: image_rewrite_filter.h:62
static bool ExtractAssociatedImageInfo(const CachedResult *in, RewriteContext *context, AssociatedImageInfo *out)
static const char kImageNoRewritesHighResolution[]
Statistic names:
Definition: image_rewrite_filter.h:67
Definition: rewrite_options.h:84
Definition: image_url_encoder.h:62
bool ShouldResize(const ResourceContext &context, const GoogleString &url, Image *image, ImageDim *desired_dimensions)