Chromium Code Reviews| Index: chrome/test/chromedriver/chrome/devtools_http_client.cc |
| diff --git a/chrome/test/chromedriver/chrome/devtools_http_client.cc b/chrome/test/chromedriver/chrome/devtools_http_client.cc |
| index 9397872852f2c52be9c78fd6fb46a4586b4074fd..952924baac003453cb4a341cfbd665d3af88c124 100644 |
| --- a/chrome/test/chromedriver/chrome/devtools_http_client.cc |
| +++ b/chrome/test/chromedriver/chrome/devtools_http_client.cc |
| @@ -9,6 +9,7 @@ |
| #include "base/json/json_reader.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "base/strings/string_split.h" |
| +#include "base/strings/string_util.h" |
| #include "base/strings/stringprintf.h" |
| #include "base/threading/platform_thread.h" |
| #include "base/time/time.h" |
| @@ -73,68 +74,16 @@ DevToolsHttpClient::~DevToolsHttpClient() {} |
| Status DevToolsHttpClient::Init(const base::TimeDelta& timeout) { |
| base::TimeTicks deadline = base::TimeTicks::Now() + timeout; |
| - std::string browser_version; |
| - std::string blink_version; |
| + std::string version_url = server_url_ + "/json/version"; |
| + std::string data; |
| - while (true) { |
| - Status status = GetVersion(&browser_version, &blink_version); |
| - if (status.IsOk()) |
| - break; |
| - if (status.code() != kChromeNotReachable || |
| - base::TimeTicks::Now() > deadline) { |
| - return status; |
| - } |
| + while (!FetchUrlAndLog(version_url, context_getter_.get(), &data)) { |
|
stgao
2014/09/29 23:09:54
I see once the returned data is empty.
Add "|| dat
samuong
2014/09/30 04:03:49
Done.
|
| + if (base::TimeTicks::Now() > deadline) |
| + return Status(kChromeNotReachable); |
| base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(50)); |
| } |
| - // |blink_version| is should look something like "537.36 (@159105)", and for |
| - // this example |blink_revision| should be 159105 |
| - size_t before = blink_version.find('@'); |
| - size_t after = blink_version.find(')'); |
| - if (before == std::string::npos || after == std::string::npos) { |
| - return Status(kUnknownError, |
| - "unrecognized Blink version: " + blink_version); |
| - } |
| - |
| - std::string blink_revision_string = blink_version.substr(before + 1, |
| - after - before - 1); |
| - int blink_revision_int; |
| - if (!base::StringToInt(blink_revision_string, &blink_revision_int)) { |
| - return Status(kUnknownError, |
| - "unrecognized Blink revision: " + blink_revision_string); |
| - } |
| - |
| - browser_info_.blink_revision = blink_revision_int; |
| - |
| - if (browser_version.empty()) { |
| - browser_info_.browser_name = "content shell"; |
| - return Status(kOk); |
| - } |
| - if (browser_version.find("Version/") == 0u) { |
| - browser_info_.browser_name = "webview"; |
| - return Status(kOk); |
| - } |
| - std::string prefix = "Chrome/"; |
| - if (browser_version.find(prefix) != 0u) { |
| - return Status(kUnknownError, |
| - "unrecognized Chrome version: " + browser_version); |
| - } |
| - |
| - std::string stripped_version = browser_version.substr(prefix.length()); |
| - int temp_build_no; |
| - std::vector<std::string> version_parts; |
| - base::SplitString(stripped_version, '.', &version_parts); |
| - if (version_parts.size() != 4 || |
| - !base::StringToInt(version_parts[2], &temp_build_no)) { |
| - return Status(kUnknownError, |
| - "unrecognized Chrome version: " + browser_version); |
| - } |
| - |
| - browser_info_.browser_name = "chrome"; |
| - browser_info_.browser_version = stripped_version; |
| - browser_info_.build_no = temp_build_no; |
| - |
| - return Status(kOk); |
| + return internal::ParseBrowserInfo(data, &browser_info_); |
| } |
| Status DevToolsHttpClient::GetWebViewsInfo(WebViewsInfo* views_info) { |
| @@ -195,16 +144,6 @@ const DeviceMetrics* DevToolsHttpClient::device_metrics() { |
| return device_metrics_.get(); |
| } |
| -Status DevToolsHttpClient::GetVersion(std::string* browser_version, |
| - std::string* blink_version) { |
| - std::string data; |
| - if (!FetchUrlAndLog( |
| - server_url_ + "/json/version", context_getter_.get(), &data)) |
| - return Status(kChromeNotReachable); |
| - |
| - return internal::ParseVersionInfo(data, browser_version, blink_version); |
| -} |
| - |
| Status DevToolsHttpClient::CloseFrontends(const std::string& for_client_id) { |
| WebViewsInfo views_info; |
| Status status = GetWebViewsInfo(&views_info); |
| @@ -343,26 +282,97 @@ Status ParseWebViewsInfo(const std::string& data, |
| return Status(kOk); |
| } |
| -Status ParseVersionInfo(const std::string& data, |
| - std::string* browser_version, |
| - std::string* blink_version) { |
| +Status ParseBrowserInfo(const std::string& data, BrowserInfo* browser_info) { |
| scoped_ptr<base::Value> value(base::JSONReader::Read(data)); |
| if (!value.get()) |
| return Status(kUnknownError, "version info not in JSON"); |
| + |
| base::DictionaryValue* dict; |
| if (!value->GetAsDictionary(&dict)) |
| return Status(kUnknownError, "version info not a dictionary"); |
| - if (!dict->GetString("Browser", browser_version)) { |
| - return Status( |
| - kUnknownError, |
| - "Chrome version must be >= " + GetMinimumSupportedChromeVersion(), |
| - Status(kUnknownError, "version info doesn't include string 'Browser'")); |
| + |
| + std::string browser; |
| + if (!dict->GetString("Browser", &browser)) { |
| + return Status(kUnknownError, |
| + "version info doesn't include string 'Browser'"); |
| } |
| - if (!dict->GetString("WebKit-Version", blink_version)) { |
| + |
| + std::string blink_version; |
| + if (!dict->GetString("WebKit-Version", &blink_version)) { |
| return Status(kUnknownError, |
| "version info doesn't include string 'WebKit-Version'"); |
| } |
| + |
| + Status status = internal::ParseBrowserString(browser, |
| + &browser_info->browser_name, |
| + &browser_info->browser_version, |
| + &browser_info->build_no); |
| + |
| + if (status.IsError()) |
| + return status; |
| + |
| + return internal::ParseBlinkVersionString(blink_version, |
| + &browser_info->blink_revision); |
| +} |
| + |
| +Status ParseBrowserString(const std::string& browser_string, |
| + std::string* browser_name, |
| + std::string* browser_version, |
| + int* build_no) { |
| + if (browser_string.empty()) { |
| + *browser_name = "content shell"; |
| + return Status(kOk); |
| + } |
| + |
| + if (browser_string.find("Version/") == 0u) { |
| + *browser_name = "webview"; |
| + return Status(kOk); |
| + } |
| + |
| + std::string prefix = "Chrome/"; |
| + if (browser_string.find(prefix) == 0u) { |
| + *browser_name = std::string("chrome"); |
|
stgao
2014/09/29 23:09:54
remove std::string?
samuong
2014/09/30 04:03:49
Done.
|
| + *browser_version = browser_string.substr(prefix.length()); |
| + |
| + std::vector<std::string> version_parts; |
| + base::SplitString(*browser_version, '.', &version_parts); |
| + if (version_parts.size() != 4 || |
| + !base::StringToInt(version_parts[2], build_no)) { |
| + return Status(kUnknownError, |
| + "unrecognized Chrome version: " + *browser_version); |
| + } |
| + |
| + return Status(kOk); |
| + } |
| + |
| + return Status(kUnknownError, |
| + "unrecognized Chrome version: " + browser_string); |
| +} |
| + |
| +Status ParseBlinkVersionString(const std::string& blink_version, |
| + int* blink_revision) { |
| + size_t before = blink_version.find('@'); |
| + size_t after = blink_version.find(')'); |
| + if (before == std::string::npos || after == std::string::npos) { |
| + return Status(kUnknownError, |
| + "unrecognized Blink version string: " + blink_version); |
| + } |
| + |
| + // Chrome OS reports its Blink revision as a (non-abbreviated) git hash. In |
| + // this case, ignore it and use the default blink revision, otherwise convert |
|
stgao
2014/09/29 23:09:54
Will using the default blink revision support back
samuong
2014/09/30 04:03:48
This is just the code to parse the version json an
|
| + // the svn revision number to an int. |
| + std::string revision = blink_version.substr(before + 1, after - before - 1); |
| + if (!IsGitHash(revision) && !base::StringToInt(revision, blink_revision)) { |
| + return Status(kUnknownError, "unrecognized Blink revision: " + revision); |
| + } |
| + |
| return Status(kOk); |
| } |
| +bool IsGitHash(const std::string& revision) { |
| + const int kGitHashLength = 40; |
|
stgao
2014/09/29 23:09:54
Constant variable could be defined outside of meth
samuong
2014/09/30 04:03:48
Is there any reason you prefer this? Defining it i
stgao
2014/09/30 18:13:37
The style guide says it is optional, not required.
|
| + return revision.size() == kGitHashLength |
| + && base::ContainsOnlyChars(revision, "0123456789abcdef"); |
|
stgao
2014/09/29 23:09:54
Does the function test with uppercase and lowercas
samuong
2014/09/30 04:03:48
Done.
|
| +} |
| + |
| } // namespace internal |