Page Speed Optimization Libraries  1.4.26.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 <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_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines