Page Speed Optimization Libraries  1.6.29.3
net/instaweb/http/public/user_agent_matcher.h
00001 // Copyright 2010 Google Inc. All Rights Reserved.
00014 
00015 #ifndef NET_INSTAWEB_HTTP_PUBLIC_USER_AGENT_MATCHER_H_
00016 #define NET_INSTAWEB_HTTP_PUBLIC_USER_AGENT_MATCHER_H_
00017 
00018 #include <map>
00019 #include <utility>
00020 
00021 #include "net/instaweb/util/public/basictypes.h"
00022 #include "net/instaweb/util/public/re2.h"
00023 #include "net/instaweb/util/public/scoped_ptr.h"
00024 #include "net/instaweb/util/public/string.h"
00025 #include "net/instaweb/util/public/string_util.h"
00026 #include "pagespeed/kernel/util/fast_wildcard_group.h"
00027 
00028 using std::pair;
00029 using std::make_pair;
00030 using std::map;
00031 
00032 namespace net_instaweb {
00033 
00034 class RequestHeaders;
00035 
00043 class UserAgentMatcher {
00044  public:
00045   static const char kTestUserAgentWebP[]; 
00046 
00047   static const char kTestUserAgentNoWebP[]; 
00048 
00049   enum BlinkRequestType {
00050     kBlinkWhiteListForDesktop,
00051     kBlinkBlackListForDesktop,
00052     kBlinkWhiteListForMobile,
00053     kDoesNotSupportBlinkForMobile,
00054     kNullOrEmpty,
00055     kDoesNotSupportBlink,
00056   };
00057 
00058   enum DeviceType {
00059     kDesktop,
00060     kTablet,
00061     kMobile,
00064     kEndOfDeviceType
00065   };
00066 
00067   enum PrefetchMechanism {
00068     kPrefetchNotSupported,
00069     kPrefetchImageTag,
00070     kPrefetchLinkScriptTag,
00071   };
00072 
00073   UserAgentMatcher();
00074   virtual ~UserAgentMatcher();
00075 
00076   bool IsIe(const StringPiece& user_agent) const;
00077   bool IsIe6(const StringPiece& user_agent) const;
00078   bool IsIe7(const StringPiece& user_agent) const;
00079   bool IsIe6or7(const StringPiece& user_agent) const {
00080     return IsIe6(user_agent) || IsIe7(user_agent);
00081   };
00082   bool IsIe9(const StringPiece& user_agent) const;
00083 
00084   virtual bool SupportsImageInlining(const StringPiece& user_agent) const;
00085   bool SupportsLazyloadImages(StringPiece user_agent) const;
00086 
00089   virtual BlinkRequestType GetBlinkRequestType(
00090       const char* user_agent, const RequestHeaders* request_headers) const;
00091 
00093   PrefetchMechanism GetPrefetchMechanism(const StringPiece& user_agent) const;
00094 
00096   virtual DeviceType GetDeviceTypeForUA(const StringPiece& user_agent) const;
00097 
00100   virtual DeviceType GetDeviceTypeForUAAndHeaders(
00101       const StringPiece& user_agent,
00102       const RequestHeaders* request_headers) const;
00103 
00105   static StringPiece DeviceTypeSuffix(DeviceType device_type);
00106 
00107   bool SupportsJsDefer(const StringPiece& user_agent, bool allow_mobile) const;
00108   bool SupportsWebp(const StringPiece& user_agent) const;
00109   bool SupportsWebpLosslessAlpha(const StringPiece& user_agent) const;
00110 
00115   bool SupportsDnsPrefetchUsingRelPrefetch(const StringPiece& user_agent) const;
00116   bool SupportsDnsPrefetch(const StringPiece& user_agent) const;
00117 
00118   virtual bool IsAndroidUserAgent(const StringPiece& user_agent) const;
00119   virtual bool IsiOSUserAgent(const StringPiece& user_agent) const;
00120 
00123   virtual bool GetChromeBuildNumber(const StringPiece& user_agent, int* major,
00124                                     int* minor, int* build, int* patch) const;
00125 
00126   virtual bool SupportsSplitHtml(const StringPiece& user_agent,
00127                                  bool allow_mobile) const;
00128 
00130   virtual bool GetScreenResolution(
00131         const StringPiece& user_agent, int* width, int* height);
00132 
00133   bool UserAgentExceedsChromeAndroidBuildAndPatch(
00134       const StringPiece& user_agent, int required_build,
00135       int required_patch) const;
00136 
00137   bool UserAgentExceedsChromeiOSBuildAndPatch(
00138       const StringPiece& user_agent, int required_build,
00139       int required_patch) const;
00140 
00141   bool UserAgentExceedsChromeBuildAndPatch(
00142       const StringPiece& user_agent, int required_build,
00143       int required_patch) const;
00144 
00145  private:
00146   FastWildcardGroup supports_image_inlining_;
00147   FastWildcardGroup supports_lazyload_images_;
00148   FastWildcardGroup blink_desktop_whitelist_;
00149   FastWildcardGroup blink_desktop_blacklist_;
00150   FastWildcardGroup blink_mobile_whitelist_;
00151   FastWildcardGroup supports_webp_;
00152   FastWildcardGroup supports_webp_lossless_alpha_;
00153   FastWildcardGroup supports_prefetch_link_rel_subresource_;
00154   FastWildcardGroup supports_prefetch_image_tag_;
00155   FastWildcardGroup supports_prefetch_link_script_tag_;
00156   FastWildcardGroup supports_dns_prefetch_;
00157   FastWildcardGroup mobile_user_agents_;
00158   FastWildcardGroup tablet_user_agents_;
00159 
00160   const RE2 chrome_version_pattern_;
00161   scoped_ptr<RE2> known_devices_pattern_;
00162   mutable map <GoogleString, pair<int, int> > screen_dimensions_map_;
00163 
00164   DISALLOW_COPY_AND_ASSIGN(UserAgentMatcher);
00165 };
00166 
00167 }  
00168 
00169 #endif  ///< NET_INSTAWEB_HTTP_PUBLIC_USER_AGENT_MATCHER_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines