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 |