Page Speed Optimization Libraries  1.8.31.2
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   enum Availability {
00068     kDisabled,   
00069     kNoDataYet,  
00070     kAvailable,  
00071   };
00072   static const char kCriticalImagesValidCount[];
00073   static const char kCriticalImagesExpiredCount[];
00074   static const char kCriticalImagesNotFoundCount[];
00075   static const char kCriticalImagesPropertyName[];
00078   static const char kRenderedImageDimensionsProperty[];
00079 
00080   CriticalImagesFinder(const PropertyCache::Cohort* cohort, Statistics* stats);
00081   virtual ~CriticalImagesFinder();
00082 
00083   static void InitStats(Statistics* statistics);
00084 
00088   virtual Availability Available(RewriteDriver* driver);
00089 
00095   virtual int PercentSeenForCritical() const {
00096     return kDefaultPercentSeenForCritical;
00097   }
00098 
00106   virtual int SupportInterval() const {
00107     return kDefaultImageSupportInterval;
00108   }
00109 
00115   bool IsHtmlCriticalImage(const GoogleString& image_url,
00116                            RewriteDriver* driver);
00117 
00118   bool IsCssCriticalImage(const GoogleString& image_url,
00119                           RewriteDriver* driver);
00120 
00123   bool GetRenderedImageDimensions(
00124       RewriteDriver* driver,
00125       const GoogleUrl& image_src_gurl,
00126       std::pair<int32, int32>* dimensions);
00127 
00130   const StringSet& GetHtmlCriticalImages(RewriteDriver* driver);
00131   const StringSet& GetCssCriticalImages(RewriteDriver* driver);
00132 
00139   StringSet* mutable_html_critical_images(RewriteDriver* driver);
00140   StringSet* mutable_css_critical_images(RewriteDriver* driver);
00141 
00143   virtual void ComputeCriticalImages(RewriteDriver* driver) = 0;
00144 
00149   const PropertyCache::Cohort* cohort() const { return cohort_; }
00150 
00156   bool UpdateCriticalImagesCacheEntryFromDriver(
00157       const StringSet* html_critical_images_set,
00158       const StringSet* css_critical_images_set,
00159       RewriteDriver* driver);
00160 
00165   static bool PopulateCriticalImagesFromPropertyValue(
00166       const PropertyValue* property_value, CriticalImages* critical_images);
00167 
00171   static bool UpdateCriticalImagesCacheEntry(
00172       const StringSet* html_critical_images_set,
00173       const StringSet* css_critical_images_set,
00174       const RenderedImages* rendered_images_set,
00175       int support_interval,
00176       const PropertyCache::Cohort* cohort,
00177       AbstractPropertyPage* page);
00178 
00181   virtual bool IsCriticalImageInfoPresent(RewriteDriver* driver);
00182 
00184   virtual RenderedImages* ExtractRenderedImageDimensionsFromCache(
00185       RewriteDriver* driver);
00186 
00188   void AddHtmlCriticalImage(const GoogleString& url,
00189                             RewriteDriver* driver);
00190 
00193   RenderedImages* JsonMapToRenderedImagesMap(const GoogleString& str,
00194                                              const RewriteOptions* options);
00195 
00198   virtual bool ShouldBeacon(RewriteDriver* driver) { return false; }
00199 
00204   virtual BeaconMetadata PrepareForBeaconInsertion(RewriteDriver* driver) {
00205     BeaconMetadata result;
00206     result.status = kBeaconNoNonce;
00207     return result;
00208   }
00209 
00215   virtual void UpdateCandidateImagesForBeaconing(const StringSet& images,
00216                                                  RewriteDriver* driver,
00217                                                  bool beaconing) {}
00218 
00219  protected:
00222   static bool UpdateAndWriteBackCriticalImagesCacheEntry(
00223       const StringSet* html_critical_images_set,
00224       const StringSet* css_critical_images_set,
00225       const RenderedImages* rendered_images_set,
00226       int support_interval,
00227       const PropertyCache::Cohort* cohort,
00228       AbstractPropertyPage* page,
00229       CriticalImages* critical_images);
00230 
00235   virtual void UpdateCriticalImagesSetInDriver(RewriteDriver* driver);
00236 
00237   virtual GoogleString GetKeyForUrl(const GoogleString& url) {
00238     return url;
00239   }
00240 
00244   CriticalImagesInfo* ExtractCriticalImagesFromCache(
00245       RewriteDriver* driver,
00246       const PropertyValue* property_value);
00247 
00248  private:
00249   friend class CriticalImagesFinderTestBase;
00250 
00255   static bool UpdateCriticalImages(const StringSet* html_critical_images,
00256                                    const StringSet* css_critical_images,
00257                                    int support_interval,
00258                                    CriticalImages* critical_images);
00259 
00262   static const int kDefaultPercentSeenForCritical = 100;
00263   static const int kDefaultImageSupportInterval = 1;
00264 
00265   const PropertyCache::Cohort* cohort_;
00266 
00267   Variable* critical_images_valid_count_;
00268   Variable* critical_images_expired_count_;
00269   Variable* critical_images_not_found_count_;
00270 
00271   DISALLOW_COPY_AND_ASSIGN(CriticalImagesFinder);
00272 };
00273 
00274 }  
00275 
00276 #endif  ///< NET_INSTAWEB_REWRITER_PUBLIC_CRITICAL_IMAGES_FINDER_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines