Page Speed Optimization Libraries
1.4.26.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 <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 "third_party/instaweb/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 enum BlinkRequestType { 00046 kBlinkWhiteListForDesktop, 00047 kBlinkBlackListForDesktop, 00048 kBlinkWhiteListForMobile, 00049 kDoesNotSupportBlinkForMobile, 00050 kNullOrEmpty, 00051 kDoesNotSupportBlink, 00052 }; 00053 00054 enum DeviceType { 00055 kDesktop, 00056 kTablet, 00057 kMobile, 00060 kEndOfDeviceType 00061 }; 00062 00063 enum PrefetchMechanism { 00064 kPrefetchNotSupported, 00065 kPrefetchLinkRelSubresource, 00066 kPrefetchImageTag, 00067 kPrefetchObjectTag, 00068 kPrefetchLinkScriptTag, 00069 }; 00070 00072 static const char kDevicePropertiesCohort[]; 00073 static const char kScreenWidth[]; 00074 static const char kScreenHeight[]; 00075 00076 UserAgentMatcher(); 00077 virtual ~UserAgentMatcher(); 00078 00079 bool IsIe(const StringPiece& user_agent) const; 00080 bool IsIe6(const StringPiece& user_agent) const; 00081 bool IsIe7(const StringPiece& user_agent) const; 00082 bool IsIe6or7(const StringPiece& user_agent) const { 00083 return IsIe6(user_agent) || IsIe7(user_agent); 00084 }; 00085 bool IsIe9(const StringPiece& user_agent) const; 00086 00087 virtual bool SupportsImageInlining(const StringPiece& user_agent) const; 00088 bool SupportsLazyloadImages(StringPiece user_agent) const; 00089 00092 virtual BlinkRequestType GetBlinkRequestType( 00093 const char* user_agent, const RequestHeaders* request_headers) const; 00094 00096 PrefetchMechanism GetPrefetchMechanism(const StringPiece& user_agent) const; 00097 00099 DeviceType GetDeviceTypeForUA(const StringPiece& user_agent) const; 00100 00102 static StringPiece DeviceTypeSuffix(DeviceType device_type); 00103 00104 bool SupportsJsDefer(const StringPiece& user_agent, bool allow_mobile) const; 00105 bool SupportsWebp(const StringPiece& user_agent) const; 00106 bool SupportsWebpLosslessAlpha(const StringPiece& user_agent) const; 00107 00112 bool SupportsDnsPrefetchUsingRelPrefetch(const StringPiece& user_agent) const; 00113 bool SupportsDnsPrefetch(const StringPiece& user_agent) const; 00114 00115 virtual bool IsMobileUserAgent(const StringPiece& user_agent) const; 00116 virtual bool IsMobileRequest( 00117 const StringPiece& user_agent, 00118 const RequestHeaders* request_headers) const; 00119 00120 virtual bool IsAndroidUserAgent(const StringPiece& user_agent) const; 00121 00124 virtual bool GetChromeBuildNumber(const StringPiece& user_agent, int* major, 00125 int* minor, int* build, int* patch) const; 00126 00127 virtual bool SupportsSplitHtml(const StringPiece& user_agent, 00128 bool allow_mobile) const; 00129 00131 virtual bool GetScreenResolution( 00132 const StringPiece& user_agent, int* width, int* height); 00133 00134 bool UserAgentExceedsChromeAndroidBuildAndPatch( 00135 const StringPiece& user_agent, int required_build, 00136 int required_patch) const; 00137 00138 private: 00139 FastWildcardGroup supports_image_inlining_; 00140 FastWildcardGroup supports_lazyload_images_; 00141 FastWildcardGroup blink_desktop_whitelist_; 00142 FastWildcardGroup blink_desktop_blacklist_; 00143 FastWildcardGroup blink_mobile_whitelist_; 00144 FastWildcardGroup supports_webp_; 00145 FastWildcardGroup supports_webp_lossless_alpha_; 00146 FastWildcardGroup mobile_user_agents_; 00147 FastWildcardGroup supports_prefetch_link_rel_subresource_; 00148 FastWildcardGroup supports_prefetch_image_tag_; 00149 FastWildcardGroup supports_prefetch_link_script_tag_; 00150 FastWildcardGroup supports_dns_prefetch_; 00151 00152 const RE2 chrome_version_pattern_; 00153 scoped_ptr<RE2> known_devices_pattern_; 00154 mutable map <GoogleString, pair<int, int> > screen_dimensions_map_; 00155 00156 DISALLOW_COPY_AND_ASSIGN(UserAgentMatcher); 00157 }; 00158 00159 } 00160 00161 #endif ///< NET_INSTAWEB_HTTP_PUBLIC_USER_AGENT_MATCHER_H_