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