Page Speed Optimization Libraries  1.3.25.1
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 "net/instaweb/util/public/basictypes.h"
00019 #include "net/instaweb/util/public/re2.h"
00020 #include "net/instaweb/util/public/string_util.h"
00021 #include "net/instaweb/util/public/fast_wildcard_group.h"
00022 
00023 using std::pair;
00024 using std::make_pair;
00025 using std::map;
00026 
00027 namespace net_instaweb {
00028 
00029 class PropertyCache;
00030 class PropertyPage;
00031 class RequestHeaders;
00032 
00040 class UserAgentMatcher {
00041  public:
00042   enum BlinkRequestType {
00043     kBlinkWhiteListForDesktop,
00044     kBlinkBlackListForDesktop,
00045     kBlinkWhiteListForMobile,
00046     kDoesNotSupportBlinkForMobile,
00047     kNullOrEmpty,
00048     kDoesNotSupportBlink,
00049   };
00050 
00051   enum DeviceType {
00052     kDesktop,
00053     kTablet,
00054     kMobile,
00057     kEndOfDeviceType
00058   };
00059 
00060   enum PrefetchMechanism {
00061     kPrefetchNotSupported,
00062     kPrefetchLinkRelSubresource,
00063     kPrefetchImageTag,
00064     kPrefetchObjectTag,
00065     kPrefetchLinkScriptTag,
00066   };
00067 
00069   static const char kDevicePropertiesCohort[];
00070   static const char kScreenWidth[];
00071   static const char kScreenHeight[];
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 
00088   virtual BlinkRequestType GetBlinkRequestType(
00089       const char* user_agent, const RequestHeaders* request_headers) const;
00090 
00092   PrefetchMechanism GetPrefetchMechanism(
00093       const StringPiece& user_agent,
00094       const RequestHeaders* request_headers) const;
00095 
00097   DeviceType GetDeviceTypeForUA(const StringPiece& user_agent) const;
00098 
00100   static StringPiece DeviceTypeSuffix(DeviceType device_type);
00101 
00102   bool SupportsJsDefer(const StringPiece& user_agent, bool allow_mobile) const;
00103   bool SupportsWebp(const StringPiece& user_agent) const;
00104   bool SupportsWebpLosslessAlpha(const StringPiece& user_agent) const;
00105 
00110   bool SupportsDnsPrefetchUsingRelPrefetch(const StringPiece& user_agent) const;
00111   bool SupportsDnsPrefetch(const StringPiece& user_agent) const;
00112 
00113   virtual bool IsMobileUserAgent(const StringPiece& user_agent) const;
00114   virtual bool IsMobileRequest(
00115       const StringPiece& user_agent,
00116       const RequestHeaders* request_headers) const;
00117 
00118   virtual bool IsAndroidUserAgent(const StringPiece& user_agent) const;
00119 
00122   virtual bool GetChromeBuildNumber(const StringPiece& user_agent, int* major,
00123                                     int* minor, int* build, int* patch) const;
00124 
00125   virtual bool SupportsSplitHtml(const StringPiece& user_agent,
00126                                  bool allow_mobile) const;
00127 
00129   virtual bool GetScreenResolution(
00130         const StringPiece& user_agent, int* width, int* height);
00131 
00132  private:
00133   FastWildcardGroup supports_image_inlining_;
00134   FastWildcardGroup blink_desktop_whitelist_;
00135   FastWildcardGroup blink_desktop_blacklist_;
00136   FastWildcardGroup blink_mobile_whitelist_;
00137   FastWildcardGroup supports_webp_;
00138   FastWildcardGroup supports_webp_lossless_alpha_;
00139   FastWildcardGroup mobile_user_agents_;
00140   FastWildcardGroup supports_prefetch_link_rel_subresource_;
00141   FastWildcardGroup supports_prefetch_image_tag_;
00142   FastWildcardGroup supports_prefetch_link_script_tag_;
00143   FastWildcardGroup supports_dns_prefetch_;
00144 
00145   const RE2 chrome_version_pattern_;
00146   mutable map <GoogleString, pair<int, int> > screen_dimensions_map_;
00147   GoogleString known_devices_pattern_;
00148 
00149   DISALLOW_COPY_AND_ASSIGN(UserAgentMatcher);
00150 };
00151 
00152 }  
00153 
00154 #endif  ///< NET_INSTAWEB_HTTP_PUBLIC_USER_AGENT_MATCHER_H_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines