Page Speed Optimization Libraries  1.11.33.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends 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 <map>
23 
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"
44 
45 namespace net_instaweb {
46 
48  INLINE_SUCCESS,
49  INLINE_UNSUPPORTED_DEVICE,
50  INLINE_NOT_CRITICAL,
51  INLINE_NO_DATA,
52  INLINE_TOO_LARGE,
53  INLINE_CACHE_SMALL_IMAGES_UNREWRITTEN,
56  INLINE_INTERNAL_ERROR,
57 };
58 
63  public:
64  typedef std::map<GoogleString, AssociatedImageInfo> AssociatedImageInfoMap;
65 
67  static const char kImageNoRewritesHighResolution[];
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[];
100 
104  static const char kInlinableImageUrlsPropertyName[];
105 
106  static const RewriteOptions::Filter kRelatedFilters[];
107  static const int kRelatedFiltersSize;
108 
109  explicit ImageRewriteFilter(RewriteDriver* driver);
110  virtual ~ImageRewriteFilter();
111  static void InitStats(Statistics* statistics);
112  static void Initialize();
113  static void Terminate();
114  static void AddRelatedOptions(StringPieceVector* target);
115  virtual void StartDocumentImpl();
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;
124 
128  void RegisterImageInfo(const AssociatedImageInfo& image_info);
129 
135  static bool ExtractAssociatedImageInfo(const CachedResult* in,
136  RewriteContext* context,
137  AssociatedImageInfo* out);
138 
141  InlineResult TryInline(bool is_html, bool is_critical,
142  int64 image_inline_max_bytes, const CachedResult* cached_result,
143  ResourceSlot* slot, GoogleString* data_url);
144 
164  static bool ParseDimensionAttribute(const char* position, int* value);
165 
169  RewriteContext* MakeNestedRewriteContextForCss(
170  int64 css_image_inline_max_bytes,
171  RewriteContext* parent,
172  const ResourceSlotPtr& slot);
173 
176  virtual RewriteContext* MakeNestedRewriteContext(RewriteContext* parent,
177  const ResourceSlotPtr& slot);
178 
182  const ImageDim& image_dim, const ResourceContext& resource_context,
183  ImageDim* desired_dim);
184 
188  bool ShouldResize(const ResourceContext& context,
189  const GoogleString& url,
190  Image* image,
191  ImageDim* desired_dimensions);
192 
196  const RewriteContext* rewrite_context, const GoogleString& url,
197  ResourceContext* context, Image* image, CachedResult* cached);
198 
201  Image::CompressionOptions* ImageOptionsForLoadedResource(
202  const ResourceContext& context, const ResourcePtr& input_resource);
203 
204  virtual const RewriteOptions::Filter* RelatedFilters(int* num_filters) const;
205  virtual const StringPieceVector* RelatedOptions() const {
206  return related_options_;
207  }
208 
210  static void DisableRelatedFilters(RewriteOptions* options);
211 
213  void ReportDroppedRewrite();
214 
215  protected:
216  virtual const UrlSegmentEncoder* encoder() const;
217 
219 
220  private:
221  class Context;
222  friend class Context;
223 
225  void InfoAndTrace(Context* context, const char* format, ...)
226  INSTAWEB_PRINTF_FORMAT(3, 4);
227  const ContentType* ImageToContentType(const GoogleString& origin_url,
228  Image* image);
229  void BeginRewriteImageUrl(HtmlElement* element, HtmlElement::Attribute* src);
230 
231  RewriteResult RewriteLoadedResourceImpl(Context* context,
232  const ResourcePtr& input_resource,
233  const OutputResourcePtr& result);
234 
236  bool FinishRewriteCssImageUrl(
237  int64 css_image_inline_max_bytes,
238  const CachedResult* cached, ResourceSlot* slot,
239  InlineResult* inline_result);
240 
242  bool FinishRewriteImageUrl(
243  const CachedResult* cached, const ResourceContext* resource_context,
244  HtmlElement* element, HtmlElement::Attribute* src, int image_index,
245  HtmlResourceSlot* slot, InlineResult* inline_result);
246 
248  void SaveIfInlinable(const StringPiece& contents,
249  const ImageType image_type,
250  CachedResult* cached);
251 
256  void GetDimensions(HtmlElement* element, ImageDim* page_dim,
257  const HtmlElement::Attribute* src,
258  bool* is_resized_using_rendered_dimensions);
259 
262  bool HasAnyDimensions(HtmlElement* element);
263 
266  void ResizeLowQualityImage(
267  Image* low_image, const ResourcePtr& input_resource,
268  CachedResult* cached);
269 
274  bool IsHtmlCriticalImage(StringPiece image_url) const;
275 
279  bool StoreUrlInPropertyCache(const StringPiece& url);
280 
281  void SaveDebugMessageToCache(const GoogleString& message,
282  Context* rewrite_context,
283  CachedResult* cached_result);
284 
286 
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_;
334 
336  Variable* image_rewrite_latency_total_ms_;
338  Histogram* image_rewrite_latency_ok_ms_;
340  Histogram* image_rewrite_latency_failed_ms_;
341 
342  ImageUrlEncoder encoder_;
343 
346  int image_counter_;
347 
351  StringSet inlinable_urls_;
352 
354  Image::ConversionVariables webp_conversion_variables_;
355 
357  static StringPieceVector* related_options_;
358 
359  std::map<GoogleString, AssociatedImageInfo> image_info_;
361  bool saw_end_document_;
362 
363 
364 };
365 
366 }
367 
368 #endif
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)
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
Definition: image.h:39
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)