| Index: base/win/win_util.cc
 | 
| diff --git a/base/win/win_util.cc b/base/win/win_util.cc
 | 
| index 93ec543338d1b94818fcc3ae93965af83cc14556..106dca904c03aa9c93342211f668b50db942a9ae 100644
 | 
| --- a/base/win/win_util.cc
 | 
| +++ b/base/win/win_util.cc
 | 
| @@ -99,6 +99,12 @@ const wchar_t kWindows8OSKRegPath[] =
 | 
|      L"Software\\Classes\\CLSID\\{054AAE20-4BEA-4347-8A35-64A533254A9D}"
 | 
|      L"\\LocalServer32";
 | 
|  
 | 
| +// Returns the current platform role. We use the PowerDeterminePlatformRoleEx
 | 
| +// API for that.
 | 
| +POWER_PLATFORM_ROLE GetPlatformRole() {
 | 
| +  return PowerDeterminePlatformRoleEx(POWER_PLATFORM_ROLE_V2);
 | 
| +}
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  // Returns true if a physical keyboard is detected on Windows 8 and up.
 | 
| @@ -109,7 +115,7 @@ const wchar_t kWindows8OSKRegPath[] =
 | 
|  bool IsKeyboardPresentOnSlate(std::string* reason) {
 | 
|    bool result = false;
 | 
|  
 | 
| -  if (GetVersion() < VERSION_WIN7) {
 | 
| +  if (GetVersion() < VERSION_WIN8) {
 | 
|      *reason = "Detection not supported";
 | 
|      return false;
 | 
|    }
 | 
| @@ -133,10 +139,13 @@ bool IsKeyboardPresentOnSlate(std::string* reason) {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  // If the device is docked, the user is treating the device as a PC.
 | 
| -  if (GetSystemMetrics(SM_SYSTEMDOCKED) != 0) {
 | 
| +  if (IsTabletDevice(reason)) {
 | 
| +    if (reason)
 | 
| +      *reason += "Tablet device.\n";
 | 
| +    return true;
 | 
| +  } else {
 | 
|      if (reason) {
 | 
| -      *reason += "SM_SYSTEMDOCKED\n";
 | 
| +      *reason += "Not a tablet device";
 | 
|        result = true;
 | 
|      } else {
 | 
|        return true;
 | 
| @@ -182,23 +191,6 @@ bool IsKeyboardPresentOnSlate(std::string* reason) {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  // Check if the device is being used as a laptop or a tablet. This can be
 | 
| -  // checked by first checking the role of the device and then the
 | 
| -  // corresponding system metric (SM_CONVERTIBLESLATEMODE). If it is being used
 | 
| -  // as a tablet then we want the OSK to show up.
 | 
| -  POWER_PLATFORM_ROLE role = PowerDeterminePlatformRole();
 | 
| -
 | 
| -  if (((role == PlatformRoleMobile) || (role == PlatformRoleSlate)) &&
 | 
| -       (GetSystemMetrics(SM_CONVERTIBLESLATEMODE) == 0)) {
 | 
| -      if (reason) {
 | 
| -        *reason += (role == PlatformRoleMobile) ? "PlatformRoleMobile\n" :
 | 
| -                                                  "PlatformRoleSlate\n";
 | 
| -        // Don't change result here if it's already true.
 | 
| -      } else {
 | 
| -        return false;
 | 
| -      }
 | 
| -  }
 | 
| -
 | 
|    const GUID KEYBOARD_CLASS_GUID =
 | 
|        { 0x4D36E96B, 0xE325,  0x11CE,
 | 
|            { 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18 } };
 | 
| @@ -390,30 +382,56 @@ void SetAbortBehaviorForCrashReporting() {
 | 
|    signal(SIGABRT, ForceCrashOnSigAbort);
 | 
|  }
 | 
|  
 | 
| -bool IsTabletDevice() {
 | 
| -  if (GetSystemMetrics(SM_MAXIMUMTOUCHES) == 0)
 | 
| +bool IsTabletDevice(std::string* reason) {
 | 
| +  if (GetVersion() < VERSION_WIN8) {
 | 
| +    if (reason)
 | 
| +      *reason = "Tablet device detection not supported below Windows 8\n";
 | 
|      return false;
 | 
| +  }
 | 
|  
 | 
| -  Version version = GetVersion();
 | 
| -  if (version == VERSION_XP)
 | 
| -    return (GetSystemMetrics(SM_TABLETPC) != 0);
 | 
| +  if (GetSystemMetrics(SM_MAXIMUMTOUCHES) == 0) {
 | 
| +    if (reason) {
 | 
| +      *reason += "Device does not support touch.\n";
 | 
| +    } else {
 | 
| +      return false;
 | 
| +    }
 | 
| +  }
 | 
|  
 | 
|    // If the device is docked, the user is treating the device as a PC.
 | 
| -  if (GetSystemMetrics(SM_SYSTEMDOCKED) != 0)
 | 
| -    return false;
 | 
| +  if (GetSystemMetrics(SM_SYSTEMDOCKED) != 0) {
 | 
| +    if (reason) {
 | 
| +      *reason += "SM_SYSTEMDOCKED\n";
 | 
| +    } else {
 | 
| +      return false;
 | 
| +    }
 | 
| +  }
 | 
|  
 | 
| -  // PlatformRoleSlate was only added in Windows 8, but prior to Win8 it is
 | 
| -  // still possible to check for a mobile power profile.
 | 
| -  POWER_PLATFORM_ROLE role = PowerDeterminePlatformRole();
 | 
| +  // PlatformRoleSlate was added in Windows 8+.
 | 
| +  POWER_PLATFORM_ROLE role = GetPlatformRole();
 | 
|    bool mobile_power_profile = (role == PlatformRoleMobile);
 | 
| -  bool slate_power_profile = false;
 | 
| -  if (version >= VERSION_WIN8)
 | 
| -    slate_power_profile = (role == PlatformRoleSlate);
 | 
| +  bool slate_power_profile = (role == PlatformRoleSlate);
 | 
|  
 | 
| -  if (mobile_power_profile || slate_power_profile)
 | 
| -    return (GetSystemMetrics(SM_CONVERTIBLESLATEMODE) == 0);
 | 
| +  bool is_tablet = false;
 | 
|  
 | 
| -  return false;
 | 
| +  if (mobile_power_profile || slate_power_profile) {
 | 
| +    is_tablet = !GetSystemMetrics(SM_CONVERTIBLESLATEMODE);
 | 
| +    if (!is_tablet) {
 | 
| +      if (reason) {
 | 
| +        *reason += "Not in slate mode.\n";
 | 
| +      } else {
 | 
| +        return false;
 | 
| +      }
 | 
| +    } else {
 | 
| +      if (reason) {
 | 
| +        *reason += (role == PlatformRoleMobile) ? "PlatformRoleMobile\n" :
 | 
| +                                                  "PlatformRoleSlate\n";
 | 
| +      }
 | 
| +    }
 | 
| +  } else {
 | 
| +    if (reason)
 | 
| +      *reason += "Device role is not mobile or slate.\n";
 | 
| +  }
 | 
| +  return is_tablet;
 | 
|  }
 | 
|  
 | 
|  bool DisplayVirtualKeyboard() {
 | 
| 
 |