Page Speed Optimization Libraries  1.9.32.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
image_rewrite_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_IMAGE_REWRITE_FILTER_H_
20 #define NET_INSTAWEB_REWRITER_PUBLIC_IMAGE_REWRITE_FILTER_H_
21 
22 #include "net/instaweb/htmlparse/public/html_element.h"
23 #include "net/instaweb/rewriter/image_types.pb.h"
36 
37 namespace net_instaweb {
38 
39 class CachedResult;
40 class ImageDim;
41 class Histogram;
42 class ResourceContext;
43 class RewriteContext;
44 class RewriteDriver;
45 class Statistics;
46 class TimedVariable;
47 class UrlSegmentEncoder;
48 class Variable;
49 class WorkBound;
50 struct ContentType;
51 
52 enum InlineResult {
53  INLINE_SUCCESS,
54  INLINE_UNSUPPORTED_DEVICE,
55  INLINE_NOT_CRITICAL,
56  INLINE_NO_DATA,
57  INLINE_TOO_LARGE,
58  INLINE_CACHE_SMALL_IMAGES_UNREWRITTEN,
59  INLINE_INTERNAL_ERROR,
60 };
61 
66  public:
68  static const char kImageNoRewritesHighResolution[];
69  static const char kImageOngoingRewrites[];
70  static const char kImageResizedUsingRenderedDimensions[];
71  static const char kImageRewriteLatencyFailedMs[];
72  static const char kImageRewriteLatencyOkMs[];
73  static const char kImageRewriteLatencyTotalMs[];
74  static const char kImageRewritesDroppedDecodeFailure[];
75  static const char kImageRewritesDroppedDueToLoad[];
76  static const char kImageRewritesDroppedMIMETypeUnknown[];
77  static const char kImageRewritesDroppedNoSavingNoResize[];
78  static const char kImageRewritesDroppedNoSavingResize[];
79  static const char kImageRewritesDroppedServerWriteFail[];
80  static const char kImageRewritesSquashingForMobileScreen[];
81  static const char kImageRewrites[];
82  static const char kImageWebpRewrites[];
83  static const char kImageWebpFromGifFailureMs[];
84  static const char kImageWebpFromGifSuccessMs[];
85  static const char kImageWebpFromGifTimeouts[];
86  static const char kImageWebpFromJpegFailureMs[];
87  static const char kImageWebpFromJpegSuccessMs[];
88  static const char kImageWebpFromJpegTimeouts[];
89  static const char kImageWebpFromPngFailureMs[];
90  static const char kImageWebpFromPngSuccessMs[];
91  static const char kImageWebpFromPngTimeouts[];
92  static const char kImageWebpOpaqueFailureMs[];
93  static const char kImageWebpOpaqueSuccessMs[];
94  static const char kImageWebpOpaqueTimeouts[];
95  static const char kImageWebpWithAlphaFailureMs[];
96  static const char kImageWebpWithAlphaSuccessMs[];
97  static const char kImageWebpWithAlphaTimeouts[];
98 
102  static const char kInlinableImageUrlsPropertyName[];
103 
104  static const RewriteOptions::Filter kRelatedFilters[];
105  static const int kRelatedFiltersSize;
106 
107  explicit ImageRewriteFilter(RewriteDriver* driver);
108  virtual ~ImageRewriteFilter();
109  static void InitStats(Statistics* statistics);
110  static void Initialize();
111  static void Terminate();
112  static void AddRelatedOptions(StringPieceVector* target);
113  virtual void StartDocumentImpl();
114  virtual void StartElementImpl(HtmlElement* element) {}
115  virtual void EndElementImpl(HtmlElement* element);
116  virtual const char* Name() const { return "ImageRewrite"; }
117  virtual const char* id() const { return RewriteOptions::kImageCompressionId; }
119  ResourceContext* context) const;
120 
123  InlineResult TryInline(bool is_html, bool is_critical,
124  int64 image_inline_max_bytes, const CachedResult* cached_result,
125  ResourceSlot* slot, GoogleString* data_url);
126 
146  static bool ParseDimensionAttribute(const char* position, int* value);
147 
151  RewriteContext* MakeNestedRewriteContextForCss(
152  int64 css_image_inline_max_bytes,
153  RewriteContext* parent,
154  const ResourceSlotPtr& slot);
155 
158  virtual RewriteContext* MakeNestedRewriteContext(RewriteContext* parent,
159  const ResourceSlotPtr& slot);
160 
164  const ImageDim& image_dim, const ResourceContext& resource_context,
165  ImageDim* desired_dim);
166 
170  bool ShouldResize(const ResourceContext& context,
171  const GoogleString& url,
172  Image* image,
173  ImageDim* desired_dimensions);
174 
178  const RewriteContext* rewrite_context, const GoogleString& url,
179  ResourceContext* context, Image* image, CachedResult* cached);
180 
183  Image::CompressionOptions* ImageOptionsForLoadedResource(
184  const ResourceContext& context, const ResourcePtr& input_resource,
185  bool is_css);
186 
187  virtual const RewriteOptions::Filter* RelatedFilters(int* num_filters) const;
188  virtual const StringPieceVector* RelatedOptions() const {
189  return related_options_;
190  }
191 
193  static void DisableRelatedFilters(RewriteOptions* options);
194 
195  protected:
196  virtual const UrlSegmentEncoder* encoder() const;
197 
199 
200  private:
201  class Context;
202  friend class Context;
203 
205  const ContentType* ImageToContentType(const GoogleString& origin_url,
206  Image* image);
207  void BeginRewriteImageUrl(HtmlElement* element, HtmlElement::Attribute* src);
208 
209  RewriteResult RewriteLoadedResourceImpl(Context* context,
210  const ResourcePtr& input_resource,
211  const OutputResourcePtr& result);
212 
214  bool FinishRewriteCssImageUrl(
215  int64 css_image_inline_max_bytes,
216  const CachedResult* cached, ResourceSlot* slot,
217  InlineResult* inline_result);
218 
220  bool FinishRewriteImageUrl(
221  const CachedResult* cached, const ResourceContext* resource_context,
222  HtmlElement* element, HtmlElement::Attribute* src, int image_index,
223  HtmlResourceSlot* slot, InlineResult* inline_result);
224 
226  void SaveIfInlinable(const StringPiece& contents,
227  const ImageType image_type,
228  CachedResult* cached);
229 
234  void GetDimensions(HtmlElement* element, ImageDim* page_dim,
235  const HtmlElement::Attribute* src,
236  bool* is_resized_using_rendered_dimensions);
237 
240  bool HasAnyDimensions(HtmlElement* element);
241 
244  void ResizeLowQualityImage(
245  Image* low_image, const ResourcePtr& input_resource,
246  CachedResult* cached);
247 
252  bool IsHtmlCriticalImage(StringPiece image_url) const;
253 
257  bool StoreUrlInPropertyCache(const StringPiece& url);
258 
259  bool SquashImagesForMobileScreenEnabled() const;
260 
261  void SaveDebugMessageToCache(const GoogleString& message,
262  Context* rewrite_context,
263  CachedResult* cached_result);
264 
265  scoped_ptr<WorkBound> work_bound_;
266 
268 
270  Variable* image_rewrites_;
272  Variable* image_resized_using_rendered_dimensions_;
274  Variable* image_norewrites_high_resolution_;
279  Variable* image_rewrites_dropped_intentionally_;
281  Variable* image_rewrites_dropped_decode_failure_;
283  Variable* image_rewrites_dropped_mime_type_unknown_;
286  Variable* image_rewrites_dropped_server_write_fail_;
289  Variable* image_rewrites_dropped_nosaving_resize_;
292  Variable* image_rewrites_dropped_nosaving_noresize_;
294  TimedVariable* image_rewrites_dropped_due_to_load_;
298  TimedVariable* image_rewrites_squashing_for_mobile_screen_;
302  Variable* image_rewrite_total_bytes_saved_;
306  Variable* image_rewrite_total_original_bytes_;
309  Variable* image_rewrite_uses_;
311  Variable* image_inline_count_;
313  Variable* image_webp_rewrites_;
314 
316  Variable* image_rewrite_latency_total_ms_;
318  Histogram* image_rewrite_latency_ok_ms_;
320  Histogram* image_rewrite_latency_failed_ms_;
321 
322  ImageUrlEncoder encoder_;
323 
326  int image_counter_;
327 
331  StringSet inlinable_urls_;
332 
334  Image::ConversionVariables webp_conversion_variables_;
335 
337  static StringPieceVector* related_options_;
338 
339  DISALLOW_COPY_AND_ASSIGN(ImageRewriteFilter);
340 };
341 
342 }
343 
344 #endif
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)
Image::CompressionOptions * ImageOptionsForLoadedResource(const ResourceContext &context, const ResourcePtr &input_resource, bool is_css)
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:214
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:37
virtual const StringPieceVector * RelatedOptions() const
Definition: image_rewrite_filter.h:188
Filter
Definition: rewrite_options.h:104
Definition: rewrite_driver.h:98
virtual const UrlSegmentEncoder * encoder() const
RewriteResult
Definition: rewrite_result.h:27
virtual const RewriteOptions::Filter * RelatedFilters(int *num_filters) const
Definition: rewrite_context.h:144
static const char kInlinableImageUrlsPropertyName[]
Definition: image_rewrite_filter.h:102
Definition: image_rewrite_filter.h:65
Definition: image.h:38
static const char kImageNoRewritesHighResolution[]
Statistic names:
Definition: image_rewrite_filter.h:68
Definition: rewrite_options.h:81
Definition: image_url_encoder.h:62
bool ShouldResize(const ResourceContext &context, const GoogleString &url, Image *image, ImageDim *desired_dimensions)