Page Speed Optimization Libraries
1.3.25.1
|
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_