1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be
33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file.
43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "webkit/glue/user_agent.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_POSIX) && !defined(OS_MACOSX)
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <sys/utsname.h>
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_util.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/sys_info.h"
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_WIN)
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/win/windows_version.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Generated
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "webkit_version.h"  // NOLINT
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace webkit_glue {
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Forward declare GetProductVersionInfo.  This is implemented in
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// renderer_glue.cc as part of the renderer lib.
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstd::string GetProductVersion();
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstd::string GetWebKitVersion() {
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return base::StringPrintf("%d.%d (%s)",
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            WEBKIT_VERSION_MAJOR,
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            WEBKIT_VERSION_MINOR,
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            WEBKIT_SVN_REVISION);
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstd::string GetWebKitRevision() {
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return WEBKIT_SVN_REVISION;
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstd::string BuildOSCpuInfo() {
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string os_cpu;
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_CHROMEOS)
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int32 os_major_version = 0;
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int32 os_minor_version = 0;
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int32 os_bugfix_version = 0;
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::SysInfo::OperatingSystemVersionNumbers(&os_major_version,
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               &os_minor_version,
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                               &os_bugfix_version);
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_POSIX) && !defined(OS_MACOSX)
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Should work on any Posix system.
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  struct utsname unixinfo;
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  uname(&unixinfo);
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string cputype;
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // special case for biarch systems
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (strcmp(unixinfo.machine, "x86_64") == 0 &&
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      sizeof(void*) == sizeof(int32)) {  // NOLINT
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    cputype.assign("i686 (x86_64)");
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    cputype.assign(unixinfo.machine);
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_WIN)
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string architecture_token;
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::win::OSInfo* os_info = base::win::OSInfo::GetInstance();
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (os_info->wow64_status() == base::win::OSInfo::WOW64_ENABLED) {
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    architecture_token = "; WOW64";
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    base::win::OSInfo::WindowsArchitecture windows_architecture =
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        os_info->architecture();
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (windows_architecture == base::win::OSInfo::X64_ARCHITECTURE)
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      architecture_token = "; Win64; x64";
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    else if (windows_architecture == base::win::OSInfo::IA64_ARCHITECTURE)
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      architecture_token = "; Win64; IA64";
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  base::StringAppendF(
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      &os_cpu,
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_WIN)
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      "Windows NT %d.%d%s",
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      os_major_version,
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      os_minor_version,
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      architecture_token.c_str()
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#elif defined(OS_MACOSX)
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "Intel Mac OS X %d_%d_%d",
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      os_major_version,
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      os_minor_version,
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      os_bugfix_version
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#elif defined(OS_CHROMEOS)
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "CrOS "
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(TOUCH_UI)
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "Touch "
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "%s %d.%d.%d",
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      cputype.c_str(),   // e.g. i686
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      os_major_version,
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      os_minor_version,
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      os_bugfix_version
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "%s %s",
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      unixinfo.sysname,  // e.g. Linux
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      cputype.c_str()    // e.g. i686
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  );  // NOLINT
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return os_cpu;
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BuildUserAgent(bool mimic_windows, std::string* result) {
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const char kUserAgentPlatform[] =
1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_WIN)
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      "";
1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#elif defined(OS_MACOSX)
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      "Macintosh; ";
1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#elif defined(USE_X11)
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      "X11; ";           // strange, but that's what Firefox uses
1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      "Unknown; ";
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Get the product name and version, and replace Safari's Version/X string
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // with it.  This is done to expose our product name in a manner that is
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // maximally compatible with Safari, we hope!!
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string product = GetProductVersion();
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Derived from Safari's UA string.
1304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  base::StringAppendF(
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      result,
132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      "Mozilla/5.0 (%s%s) AppleWebKit/%d.%d"
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      " (KHTML, like Gecko) %s Safari/%d.%d",
134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      mimic_windows ? "Windows " : kUserAgentPlatform,
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      BuildOSCpuInfo().c_str(),
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      WEBKIT_VERSION_MAJOR,
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      WEBKIT_VERSION_MINOR,
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      product.c_str(),
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      WEBKIT_VERSION_MAJOR,
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      WEBKIT_VERSION_MINOR);
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace webkit_glue
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
145