Page Speed Optimization Libraries  1.8.31.2
net/instaweb/rewriter/public/image_rewrite_filter.h
Go to the documentation of this file.
00001 /*
00002  * Copyright 2010 Google Inc.
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *      http:///www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  */
00016 
00018 
00019 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_IMAGE_REWRITE_FILTER_H_
00020 #define NET_INSTAWEB_REWRITER_PUBLIC_IMAGE_REWRITE_FILTER_H_
00021 
00022 #include "net/instaweb/htmlparse/public/html_element.h"
00023 #include "net/instaweb/rewriter/image_types.pb.h"
00024 #include "net/instaweb/rewriter/public/image.h"
00025 #include "net/instaweb/rewriter/public/image_url_encoder.h"
00026 #include "net/instaweb/rewriter/public/resource.h"
00027 #include "net/instaweb/rewriter/public/server_context.h"
00028 #include "net/instaweb/rewriter/public/resource_slot.h"
00029 #include "net/instaweb/rewriter/public/rewrite_filter.h"
00030 #include "net/instaweb/rewriter/public/rewrite_options.h"
00031 #include "net/instaweb/rewriter/public/rewrite_result.h"
00032 #include "net/instaweb/util/public/basictypes.h"
00033 #include "net/instaweb/util/public/scoped_ptr.h"
00034 #include "net/instaweb/util/public/string.h"
00035 #include "net/instaweb/util/public/string_util.h"
00036 
00037 namespace net_instaweb {
00038 
00039 class CachedResult;
00040 class ImageDim;
00041 class Histogram;
00042 class ResourceContext;
00043 class RewriteContext;
00044 class RewriteDriver;
00045 class Statistics;
00046 class TimedVariable;
00047 class UrlSegmentEncoder;
00048 class Variable;
00049 class WorkBound;
00050 struct ContentType;
00051 
00055 class ImageRewriteFilter : public RewriteFilter {
00056  public:
00058   static const char kImageNoRewritesHighResolution[];
00059   static const char kImageOngoingRewrites[];
00060   static const char kImageResizedUsingRenderedDimensions[];
00061   static const char kImageRewriteLatencyFailedMs[];
00062   static const char kImageRewriteLatencyOkMs[];
00063   static const char kImageRewriteLatencyTotalMs[];
00064   static const char kImageRewritesDroppedDecodeFailure[];
00065   static const char kImageRewritesDroppedDueToLoad[];
00066   static const char kImageRewritesDroppedMIMETypeUnknown[];
00067   static const char kImageRewritesDroppedNoSavingNoResize[];
00068   static const char kImageRewritesDroppedNoSavingResize[];
00069   static const char kImageRewritesDroppedServerWriteFail[];
00070   static const char kImageRewritesSquashingForMobileScreen[];
00071   static const char kImageRewrites[];
00072   static const char kImageWebpRewrites[];
00073   static const char kImageWebpFromGifFailureMs[];
00074   static const char kImageWebpFromGifSuccessMs[];
00075   static const char kImageWebpFromGifTimeouts[];
00076   static const char kImageWebpFromJpegFailureMs[];
00077   static const char kImageWebpFromJpegSuccessMs[];
00078   static const char kImageWebpFromJpegTimeouts[];
00079   static const char kImageWebpFromPngFailureMs[];
00080   static const char kImageWebpFromPngSuccessMs[];
00081   static const char kImageWebpFromPngTimeouts[];
00082   static const char kImageWebpOpaqueFailureMs[];
00083   static const char kImageWebpOpaqueSuccessMs[];
00084   static const char kImageWebpOpaqueTimeouts[];
00085   static const char kImageWebpWithAlphaFailureMs[];
00086   static const char kImageWebpWithAlphaSuccessMs[];
00087   static const char kImageWebpWithAlphaTimeouts[];
00088 
00092   static const char kInlinableImageUrlsPropertyName[];
00093 
00094   static const RewriteOptions::Filter kRelatedFilters[];
00095   static const int kRelatedFiltersSize;
00096 
00097   explicit ImageRewriteFilter(RewriteDriver* driver);
00098   virtual ~ImageRewriteFilter();
00099   static void InitStats(Statistics* statistics);
00100   static void Initialize();
00101   static void Terminate();
00102   static void AddRelatedOptions(StringPieceVector* target);
00103   virtual void StartDocumentImpl();
00104   virtual void StartElementImpl(HtmlElement* element) {}
00105   virtual void EndElementImpl(HtmlElement* element);
00106   virtual const char* Name() const { return "ImageRewrite"; }
00107   virtual const char* id() const { return RewriteOptions::kImageCompressionId; }
00108   virtual void EncodeUserAgentIntoResourceContext(
00109       ResourceContext* context) const;
00110 
00113   bool TryInline(
00114       int64 image_inline_max_bytes, const CachedResult* cached_result,
00115       ResourceSlot* slot, GoogleString* data_url);
00116 
00136   static bool ParseDimensionAttribute(const char* position, int* value);
00137 
00141   RewriteContext* MakeNestedRewriteContextForCss(
00142       int64 css_image_inline_max_bytes,
00143       RewriteContext* parent,
00144       const ResourceSlotPtr& slot);
00145 
00148   virtual RewriteContext* MakeNestedRewriteContext(RewriteContext* parent,
00149                                                    const ResourceSlotPtr& slot);
00150 
00153   bool UpdateDesiredImageDimsIfNecessary(
00154       const ImageDim& image_dim, const ResourceContext& resource_context,
00155       ImageDim* desired_dim);
00156 
00160   bool ShouldResize(const ResourceContext& context,
00161                     const GoogleString& url,
00162                     Image* image,
00163                     ImageDim* desired_dimensions);
00164 
00167   bool ResizeImageIfNecessary(
00168       const RewriteContext* rewrite_context, const GoogleString& url,
00169       ResourceContext* context, Image* image, CachedResult* cached);
00170 
00173   Image::CompressionOptions* ImageOptionsForLoadedResource(
00174       const ResourceContext& context, const ResourcePtr& input_resource,
00175       bool is_css);
00176 
00177   virtual const RewriteOptions::Filter* RelatedFilters(int* num_filters) const;
00178   virtual const StringPieceVector* RelatedOptions() const {
00179     return related_options_;
00180   }
00181 
00183   static void DisableRelatedFilters(RewriteOptions* options);
00184 
00185  protected:
00186   virtual const UrlSegmentEncoder* encoder() const;
00187 
00188   virtual RewriteContext* MakeRewriteContext();
00189 
00190  private:
00191   class Context;
00192   friend class Context;
00193 
00195   const ContentType* ImageToContentType(const GoogleString& origin_url,
00196                                         Image* image);
00197   void BeginRewriteImageUrl(HtmlElement* element, HtmlElement::Attribute* src);
00198 
00199   RewriteResult RewriteLoadedResourceImpl(Context* context,
00200                                           const ResourcePtr& input_resource,
00201                                           const OutputResourcePtr& result);
00202 
00204   bool FinishRewriteCssImageUrl(
00205       int64 css_image_inline_max_bytes,
00206       const CachedResult* cached, ResourceSlot* slot);
00207 
00209   bool FinishRewriteImageUrl(
00210       const CachedResult* cached, const ResourceContext* resource_context,
00211       HtmlElement* element, HtmlElement::Attribute* src, int image_index,
00212       HtmlResourceSlot* slot);
00213 
00215   void SaveIfInlinable(const StringPiece& contents,
00216                        const ImageType image_type,
00217                        CachedResult* cached);
00218 
00223   void GetDimensions(HtmlElement* element, ImageDim* page_dim,
00224                      const HtmlElement::Attribute* src,
00225                      bool* is_resized_using_rendered_dimensions);
00226 
00229   bool HasAnyDimensions(HtmlElement* element);
00230 
00233   void ResizeLowQualityImage(
00234       Image* low_image, const ResourcePtr& input_resource,
00235       CachedResult* cached);
00236 
00241   bool IsHtmlCriticalImage(StringPiece image_url) const;
00242 
00246   bool StoreUrlInPropertyCache(const StringPiece& url);
00247 
00248   bool SquashImagesForMobileScreenEnabled() const;
00249 
00250   scoped_ptr<WorkBound> work_bound_;
00251 
00253 
00255   Variable* image_rewrites_;
00257   Variable* image_resized_using_rendered_dimensions_;
00259   Variable* image_norewrites_high_resolution_;
00264   Variable* image_rewrites_dropped_intentionally_;
00266   Variable* image_rewrites_dropped_decode_failure_;
00268   Variable* image_rewrites_dropped_mime_type_unknown_;
00271   Variable* image_rewrites_dropped_server_write_fail_;
00274   Variable* image_rewrites_dropped_nosaving_resize_;
00277   Variable* image_rewrites_dropped_nosaving_noresize_;
00279   TimedVariable* image_rewrites_dropped_due_to_load_;
00283   TimedVariable* image_rewrites_squashing_for_mobile_screen_;
00287   Variable* image_rewrite_total_bytes_saved_;
00291   Variable* image_rewrite_total_original_bytes_;
00294   Variable* image_rewrite_uses_;
00296   Variable* image_inline_count_;
00298   Variable* image_webp_rewrites_;
00299 
00301   Variable* image_rewrite_latency_total_ms_;
00303   Histogram* image_rewrite_latency_ok_ms_;
00305   Histogram* image_rewrite_latency_failed_ms_;
00306 
00307   ImageUrlEncoder encoder_;
00308 
00311   int image_counter_;
00312 
00316   StringSet inlinable_urls_;
00317 
00319   Image::ConversionVariables webp_conversion_variables_;
00320 
00322   static StringPieceVector* related_options_;
00323 
00324   DISALLOW_COPY_AND_ASSIGN(ImageRewriteFilter);
00325 };
00326 
00327 }  
00328 
00329 #endif  ///< NET_INSTAWEB_REWRITER_PUBLIC_IMAGE_REWRITE_FILTER_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines