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