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