Page Speed Optimization Libraries  1.7.30.1
net/instaweb/rewriter/public/critical_images_finder.h
Go to the documentation of this file.
00001 /*
00002  * Copyright 2012 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_CRITICAL_IMAGES_FINDER_H_
00020 #define NET_INSTAWEB_REWRITER_PUBLIC_CRITICAL_IMAGES_FINDER_H_
00021 
00022 #include <map>
00023 #include <utility>
00024 
00025 #include "net/instaweb/rewriter/critical_images.pb.h"
00026 #include "net/instaweb/rewriter/public/critical_finder_support_util.h"
00027 #include "net/instaweb/util/public/basictypes.h"
00028 #include "net/instaweb/util/public/property_cache.h"
00029 #include "net/instaweb/util/public/string.h"
00030 #include "net/instaweb/util/public/string_util.h"
00031 
00032 namespace net_instaweb {
00033 
00034 class GoogleUrl;
00035 class RenderedImages;
00036 class RewriteDriver;
00037 class RewriteOptions;
00038 class Statistics;
00039 class Variable;
00040 
00041 typedef std::map<GoogleString, std::pair<int32, int32> >
00042     RenderedImageDimensionsMap;
00043 
00052 struct CriticalImagesInfo {
00053   CriticalImagesInfo()
00054       : is_critical_image_info_present(false) {}
00055   StringSet html_critical_images;
00056   StringSet css_critical_images;
00057   CriticalImages proto;
00058   bool is_critical_image_info_present;
00059   RenderedImageDimensionsMap rendered_images_map;
00060 };
00061 
00062 
00065 class CriticalImagesFinder {
00066  public:
00067   static const char kCriticalImagesValidCount[];
00068   static const char kCriticalImagesExpiredCount[];
00069   static const char kCriticalImagesNotFoundCount[];
00070   static const char kCriticalImagesPropertyName[];
00073   static const char kRenderedImageDimensionsProperty[];
00074 
00075   CriticalImagesFinder(const PropertyCache::Cohort* cohort, Statistics* stats);
00076   virtual ~CriticalImagesFinder();
00077 
00078   static void InitStats(Statistics* statistics);
00079 
00083   virtual bool IsMeaningful(const RewriteDriver* driver) const = 0;
00084 
00090   virtual int PercentSeenForCritical() const {
00091     return kDefaultPercentSeenForCritical;
00092   }
00093 
00101   virtual int SupportInterval() const {
00102     return kDefaultImageSupportInterval;
00103   }
00104 
00110   bool IsHtmlCriticalImage(const GoogleString& image_url,
00111                            RewriteDriver* driver);
00112 
00113   bool IsCssCriticalImage(const GoogleString& image_url,
00114                           RewriteDriver* driver);
00115 
00118   bool GetRenderedImageDimensions(
00119       RewriteDriver* driver,
00120       const GoogleUrl& image_src_gurl,
00121       std::pair<int32, int32>* dimensions);
00122 
00125   const StringSet& GetHtmlCriticalImages(RewriteDriver* driver);
00126   const StringSet& GetCssCriticalImages(RewriteDriver* driver);
00127 
00134   StringSet* mutable_html_critical_images(RewriteDriver* driver);
00135   StringSet* mutable_css_critical_images(RewriteDriver* driver);
00136 
00138   virtual void ComputeCriticalImages(RewriteDriver* driver) = 0;
00139 
00144   const PropertyCache::Cohort* cohort() const { return cohort_; }
00145 
00151   bool UpdateCriticalImagesCacheEntryFromDriver(
00152       const StringSet* html_critical_images_set,
00153       const StringSet* css_critical_images_set,
00154       RewriteDriver* driver);
00155 
00160   static bool PopulateCriticalImagesFromPropertyValue(
00161       const PropertyValue* property_value, CriticalImages* critical_images);
00162 
00166   static bool UpdateCriticalImagesCacheEntry(
00167       const StringSet* html_critical_images_set,
00168       const StringSet* css_critical_images_set,
00169       const RenderedImages* rendered_images_set,
00170       int support_interval,
00171       const PropertyCache::Cohort* cohort,
00172       AbstractPropertyPage* page);
00173 
00176   virtual bool IsCriticalImageInfoPresent(RewriteDriver* driver);
00177 
00179   virtual RenderedImages* ExtractRenderedImageDimensionsFromCache(
00180       RewriteDriver* driver);
00181 
00183   void AddHtmlCriticalImage(const GoogleString& url,
00184                             RewriteDriver* driver);
00185 
00188   RenderedImages* JsonMapToRenderedImagesMap(const GoogleString& str,
00189                                              const RewriteOptions* options);
00190 
00195   virtual BeaconMetadata PrepareForBeaconInsertion(RewriteDriver* driver) {
00196     BeaconMetadata result;
00197     result.status = kBeaconNoNonce;
00198     return result;
00199   }
00200 
00201  protected:
00204   static bool UpdateAndWriteBackCriticalImagesCacheEntry(
00205       const StringSet* html_critical_images_set,
00206       const StringSet* css_critical_images_set,
00207       const RenderedImages* rendered_images_set,
00208       int support_interval,
00209       const PropertyCache::Cohort* cohort,
00210       AbstractPropertyPage* page,
00211       CriticalImages* critical_images);
00212 
00217   virtual void UpdateCriticalImagesSetInDriver(RewriteDriver* driver);
00218 
00219   virtual GoogleString GetKeyForUrl(const GoogleString& url) {
00220     return url;
00221   }
00222 
00226   CriticalImagesInfo* ExtractCriticalImagesFromCache(
00227       RewriteDriver* driver,
00228       const PropertyValue* property_value);
00229 
00230  private:
00231   friend class CriticalImagesFinderTestBase;
00232 
00237   static bool UpdateCriticalImages(const StringSet* html_critical_images,
00238                                    const StringSet* css_critical_images,
00239                                    int support_interval,
00240                                    CriticalImages* critical_images);
00241 
00244   static const int kDefaultPercentSeenForCritical = 100;
00245   static const int kDefaultImageSupportInterval = 1;
00246 
00247   const PropertyCache::Cohort* cohort_;
00248 
00249   Variable* critical_images_valid_count_;
00250   Variable* critical_images_expired_count_;
00251   Variable* critical_images_not_found_count_;
00252 
00253   DISALLOW_COPY_AND_ASSIGN(CriticalImagesFinder);
00254 };
00255 
00256 }  
00257 
00258 #endif  ///< NET_INSTAWEB_REWRITER_PUBLIC_CRITICAL_IMAGES_FINDER_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines