Page Speed Optimization Libraries
1.5.27.2
|
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 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 00071 UserAgentMatcher(); 00072 virtual ~UserAgentMatcher(); 00073 00074 bool IsIe(const StringPiece& user_agent) const; 00075 bool IsIe6(const StringPiece& user_agent) const; 00076 bool IsIe7(const StringPiece& user_agent) const; 00077 bool IsIe6or7(const StringPiece& user_agent) const { 00078 return IsIe6(user_agent) || IsIe7(user_agent); 00079 }; 00080 bool IsIe9(const StringPiece& user_agent) const; 00081 00082 virtual bool SupportsImageInlining(const StringPiece& user_agent) const; 00083 bool SupportsLazyloadImages(StringPiece user_agent) const; 00084 00087 virtual BlinkRequestType GetBlinkRequestType( 00088 const char* user_agent, const RequestHeaders* request_headers) const; 00089 00091 PrefetchMechanism GetPrefetchMechanism(const StringPiece& user_agent) const; 00092 00094 virtual DeviceType GetDeviceTypeForUA(const StringPiece& user_agent) const; 00095 00098 virtual DeviceType GetDeviceTypeForUAAndHeaders( 00099 const StringPiece& user_agent, 00100 const RequestHeaders* request_headers) const; 00101 00103 static StringPiece DeviceTypeSuffix(DeviceType device_type); 00104 00105 bool SupportsJsDefer(const StringPiece& user_agent, bool allow_mobile) const; 00106 bool SupportsWebp(const StringPiece& user_agent) const; 00107 bool SupportsWebpLosslessAlpha(const StringPiece& user_agent) const; 00108 00113 bool SupportsDnsPrefetchUsingRelPrefetch(const StringPiece& user_agent) const; 00114 bool SupportsDnsPrefetch(const StringPiece& user_agent) const; 00115 00116 virtual bool IsAndroidUserAgent(const StringPiece& user_agent) const; 00117 virtual bool IsiOSUserAgent(const StringPiece& user_agent) const; 00118 00121 virtual bool GetChromeBuildNumber(const StringPiece& user_agent, int* major, 00122 int* minor, int* build, int* patch) const; 00123 00124 virtual bool SupportsSplitHtml(const StringPiece& user_agent, 00125 bool allow_mobile) const; 00126 00128 virtual bool GetScreenResolution( 00129 const StringPiece& user_agent, int* width, int* height); 00130 00131 bool UserAgentExceedsChromeAndroidBuildAndPatch( 00132 const StringPiece& user_agent, int required_build, 00133 int required_patch) const; 00134 00135 bool UserAgentExceedsChromeiOSBuildAndPatch( 00136 const StringPiece& user_agent, int required_build, 00137 int required_patch) const; 00138 00139 bool UserAgentExceedsChromeBuildAndPatch( 00140 const StringPiece& user_agent, int required_build, 00141 int required_patch) const; 00142 00143 private: 00144 FastWildcardGroup supports_image_inlining_; 00145 FastWildcardGroup supports_lazyload_images_; 00146 FastWildcardGroup blink_desktop_whitelist_; 00147 FastWildcardGroup blink_desktop_blacklist_; 00148 FastWildcardGroup blink_mobile_whitelist_; 00149 FastWildcardGroup supports_webp_; 00150 FastWildcardGroup supports_webp_lossless_alpha_; 00151 FastWildcardGroup supports_prefetch_link_rel_subresource_; 00152 FastWildcardGroup supports_prefetch_image_tag_; 00153 FastWildcardGroup supports_prefetch_link_script_tag_; 00154 FastWildcardGroup supports_dns_prefetch_; 00155 FastWildcardGroup mobile_user_agents_; 00156 FastWildcardGroup tablet_user_agents_; 00157 00158 const RE2 chrome_version_pattern_; 00159 scoped_ptr<RE2> known_devices_pattern_; 00160 mutable map <GoogleString, pair<int, int> > screen_dimensions_map_; 00161 00162 DISALLOW_COPY_AND_ASSIGN(UserAgentMatcher); 00163 }; 00164 00165 } 00166 00167 #endif ///< NET_INSTAWEB_HTTP_PUBLIC_USER_AGENT_MATCHER_H_