Page Speed Optimization Libraries  1.5.27.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 ContentType;
00041 class ImageDim;
00042 class Histogram;
00043 class ResourceContext;
00044 class RewriteContext;
00045 class RewriteDriver;
00046 class Statistics;
00047 class TimedVariable;
00048 class UrlSegmentEncoder;
00049 class Variable;
00050 class WorkBound;
00051 
00055 class ImageRewriteFilter : public RewriteFilter {
00056  public:
00058   static const char kImageOngoingRewrites[];
00059 
00061   static const char kImageNoRewritesHighResolution[];
00062 
00065   static const char kImageRewritesDroppedDueToLoad[];
00066 
00068   static const char kImageRewritesDroppedMIMETypeUnknown[];
00069 
00072   static const char kImageRewritesDroppedServerWriteFail[];
00073 
00076   static const char kImageRewritesDroppedNoSavingResize[];
00077 
00080   static const char kImageRewritesDroppedNoSavingNoResize[];
00081 
00083   static const char kImageRewritesSquashingForMobileScreen[];
00084 
00086   static const char kImageRewriteLatencyOkMs[];
00087 
00089   static const char kImageRewriteLatencyFailedMs[];
00090 
00093   static const char kImageWebpFromGifTimeouts[];
00094   static const char kImageWebpFromPngTimeouts[];
00095   static const char kImageWebpFromJpegTimeouts[];
00096 
00100   static const char kImageWebpFromGifSuccessMs[];
00101   static const char kImageWebpFromPngSuccessMs[];
00102   static const char kImageWebpFromJpegSuccessMs[];
00103 
00107   static const char kImageWebpFromGifFailureMs[];
00108   static const char kImageWebpFromPngFailureMs[];
00109   static const char kImageWebpFromJpegFailureMs[];
00110 
00112   static const char kImageWebpWithAlphaTimeouts[];
00113   static const char kImageWebpWithAlphaSuccessMs[];
00114   static const char kImageWebpWithAlphaFailureMs[];
00115 
00117   static const char kImageWebpOpaqueTimeouts[];
00118   static const char kImageWebpOpaqueSuccessMs[];
00119   static const char kImageWebpOpaqueFailureMs[];
00120 
00124   static const char kInlinableImageUrlsPropertyName[];
00125 
00126   static const RewriteOptions::Filter kRelatedFilters[];
00127   static const int kRelatedFiltersSize;
00128   static const RewriteOptions::OptionEnum kRelatedOptions[];
00129   static const int kRelatedOptionsSize;
00130 
00131   explicit ImageRewriteFilter(RewriteDriver* driver);
00132   virtual ~ImageRewriteFilter();
00133   static void InitStats(Statistics* statistics);
00134   virtual void StartDocumentImpl();
00135   virtual void StartElementImpl(HtmlElement* element) {}
00136   virtual void EndElementImpl(HtmlElement* element);
00137   virtual const char* Name() const { return "ImageRewrite"; }
00138   virtual const char* id() const { return RewriteOptions::kImageCompressionId; }
00139   virtual void EncodeUserAgentIntoResourceContext(
00140       ResourceContext* context) const;
00141 
00144   bool TryInline(
00145       int64 image_inline_max_bytes, const CachedResult* cached_result,
00146       ResourceSlot* slot, GoogleString* data_url);
00147 
00167   static bool ParseDimensionAttribute(const char* position, int* value);
00168 
00172   RewriteContext* MakeNestedRewriteContextForCss(
00173       int64 css_image_inline_max_bytes,
00174       RewriteContext* parent,
00175       const ResourceSlotPtr& slot);
00176 
00179   virtual RewriteContext* MakeNestedRewriteContext(RewriteContext* parent,
00180                                                    const ResourceSlotPtr& slot);
00181 
00184   bool UpdateDesiredImageDimsIfNecessary(
00185       const ImageDim& image_dim, const ResourceContext& resource_context,
00186       ImageDim* desired_dim);
00187 
00191   bool ShouldResize(const ResourceContext& context,
00192                     Image* image,
00193                     ImageDim* desired_dimensions);
00194 
00197   bool ResizeImageIfNecessary(
00198       const RewriteContext* rewrite_context, const GoogleString& url,
00199       ResourceContext* context, Image* image, CachedResult* cached);
00200 
00203   Image::CompressionOptions* ImageOptionsForLoadedResource(
00204       const ResourceContext& context, const ResourcePtr& input_resource,
00205       bool is_css);
00206 
00207   virtual const RewriteOptions::Filter* RelatedFilters(int* num_filters) const;
00208   virtual const RewriteOptions::OptionEnum* RelatedOptions(
00209       int* num_options) const;
00210 
00212   static void DisableRelatedFilters(RewriteOptions* options);
00213 
00214  protected:
00215   virtual const UrlSegmentEncoder* encoder() const;
00216 
00217   virtual RewriteContext* MakeRewriteContext();
00218 
00219  private:
00220   class Context;
00221   friend class Context;
00222 
00224   const ContentType* ImageToContentType(const GoogleString& origin_url,
00225                                         Image* image);
00226   void BeginRewriteImageUrl(HtmlElement* element, HtmlElement::Attribute* src);
00227 
00228   RewriteResult RewriteLoadedResourceImpl(Context* context,
00229                                           const ResourcePtr& input_resource,
00230                                           const OutputResourcePtr& result);
00231 
00233   bool FinishRewriteCssImageUrl(
00234       int64 css_image_inline_max_bytes,
00235       const CachedResult* cached, ResourceSlot* slot);
00236 
00238   bool FinishRewriteImageUrl(
00239       const CachedResult* cached, const ResourceContext* resource_context,
00240       HtmlElement* element, HtmlElement::Attribute* src, int image_index,
00241       ResourceSlot* slot);
00242 
00244   void SaveIfInlinable(const StringPiece& contents,
00245                        const ImageType image_type,
00246                        CachedResult* cached);
00247 
00250   void GetDimensions(HtmlElement* element, ImageDim* page_dim);
00251 
00254   bool HasAnyDimensions(HtmlElement* element);
00255 
00258   void ResizeLowQualityImage(
00259       Image* low_image, const ResourcePtr& input_resource,
00260       CachedResult* cached);
00261 
00266   bool IsHtmlCriticalImage(StringPiece image_url) const;
00267 
00271   bool StoreUrlInPropertyCache(const StringPiece& url);
00272 
00273   bool SquashImagesForMobileScreenEnabled() const;
00274 
00275   scoped_ptr<WorkBound> work_bound_;
00276 
00278 
00280   Variable* image_rewrites_;
00282   Variable* image_norewrites_high_resolution_;
00286   Variable* image_rewrites_dropped_intentionally_;
00288   Variable* image_rewrites_dropped_mime_type_unknown_;
00291   Variable* image_rewrites_dropped_server_write_fail_;
00294   Variable* image_rewrites_dropped_nosaving_resize_;
00297   Variable* image_rewrites_dropped_nosaving_noresize_;
00299   TimedVariable* image_rewrites_dropped_due_to_load_;
00303   TimedVariable* image_rewrites_squashing_for_mobile_screen_;
00307   Variable* image_rewrite_total_bytes_saved_;
00311   Variable* image_rewrite_total_original_bytes_;
00314   Variable* image_rewrite_uses_;
00316   Variable* image_inline_count_;
00318   Variable* image_webp_rewrites_;
00319 
00321   Histogram* image_rewrite_latency_ok_ms_;
00323   Histogram* image_rewrite_latency_failed_ms_;
00324 
00325   ImageUrlEncoder encoder_;
00326 
00329   int image_counter_;
00330 
00334   StringSet inlinable_urls_;
00335 
00337   Image::ConversionVariables webp_conversion_variables_;
00338 
00339   DISALLOW_COPY_AND_ASSIGN(ImageRewriteFilter);
00340 };
00341 
00342 }  
00343 
00344 #endif  ///< NET_INSTAWEB_REWRITER_PUBLIC_IMAGE_REWRITE_FILTER_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines