00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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 "base/scoped_ptr.h"
00023 #include "net/instaweb/htmlparse/public/html_element.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/resource_manager.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/string.h"
00034 #include "net/instaweb/util/public/string_util.h"
00035
00036 namespace net_instaweb {
00037
00038 class CachedResult;
00039 class CssResourceSlot;
00040 class ContentType;
00041 class ImageDim;
00042 class ImageTagScanner;
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:
00057 explicit ImageRewriteFilter(RewriteDriver* driver);
00058 virtual ~ImageRewriteFilter();
00059 static void Initialize(Statistics* statistics);
00060 virtual void StartDocumentImpl();
00061 virtual void StartElementImpl(HtmlElement* element) {}
00062 virtual void EndElementImpl(HtmlElement* element);
00063 virtual const char* Name() const { return "ImageRewrite"; }
00064 virtual const char* id() const { return RewriteOptions::kImageCompressionId; }
00065
00068 static bool TryInline(
00069 int64 image_inline_max_bytes, const CachedResult* cached_result,
00070 GoogleString* data_url);
00071
00091 static bool ParseDimensionAttribute(const char* position, int* value);
00092
00096 RewriteContext* MakeNestedRewriteContextForCss(
00097 int64 css_image_inline_max_bytes,
00098 RewriteContext* parent,
00099 const ResourceSlotPtr& slot);
00100
00103 virtual RewriteContext* MakeNestedRewriteContext(RewriteContext* parent,
00104 const ResourceSlotPtr& slot);
00105
00107 static const char kImageOngoingRewrites[];
00108
00111 static const char kImageRewritesDroppedDueToLoad[];
00112
00113 protected:
00114 virtual const UrlSegmentEncoder* encoder() const;
00115
00116 virtual RewriteContext* MakeRewriteContext();
00117
00118 private:
00119 class Context;
00120 friend class Context;
00121
00123 const ContentType* ImageToContentType(const GoogleString& origin_url,
00124 Image* image);
00125 void BeginRewriteImageUrl(HtmlElement* element, HtmlElement::Attribute* src);
00126
00127 RewriteResult RewriteLoadedResourceImpl(RewriteContext* context,
00128 const ResourcePtr& input_resource,
00129 const OutputResourcePtr& result);
00130
00132 bool FinishRewriteCssImageUrl(
00133 int64 css_image_inline_max_bytes,
00134 const CachedResult* cached, CssResourceSlot* slot);
00135
00137 bool FinishRewriteImageUrl(
00138 const CachedResult* cached, const ResourceContext* resource_context,
00139 HtmlElement* element, HtmlElement::Attribute* src, int image_index);
00140
00142 void SaveIfInlinable(const StringPiece& contents,
00143 const Image::Type image_type,
00144 CachedResult* cached);
00145
00148 void GetDimensions(HtmlElement* element, ImageDim* page_dim);
00149
00152 bool HasAnyDimensions(HtmlElement* element);
00153
00156 void ResizeLowQualityImage(
00157 Image* low_image, const ResourcePtr& input_resource,
00158 CachedResult* cached);
00159
00164 bool IsCriticalImage(const StringPiece& image_url, int image_index) const;
00165
00166 scoped_ptr<const ImageTagScanner> image_filter_;
00167 scoped_ptr<WorkBound> work_bound_;
00168
00170
00172 Variable* image_rewrites_;
00176 Variable* image_rewrites_dropped_intentionally_;
00178 TimedVariable* image_rewrites_dropped_due_to_load_;
00182 Variable* image_rewrite_total_bytes_saved_;
00186 Variable* image_rewrite_total_original_bytes_;
00189 Variable* image_rewrite_uses_;
00191 Variable* image_inline_count_;
00193 Variable* image_webp_rewrites_;
00194
00195 ImageUrlEncoder encoder_;
00196
00199 int image_counter_;
00200
00201 DISALLOW_COPY_AND_ASSIGN(ImageRewriteFilter);
00202 };
00203
00204 }
00205
00206 #endif ///< NET_INSTAWEB_REWRITER_PUBLIC_IMAGE_REWRITE_FILTER_H_