Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4454)

Unified Diff: chrome/test/chromedriver/chrome/browser_info.cc

Issue 605143002: [chromedriver] Accept git hashes in blink version strings from devtools (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Forgot to git add new files Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/test/chromedriver/chrome/browser_info.cc
diff --git a/chrome/test/chromedriver/chrome/browser_info.cc b/chrome/test/chromedriver/chrome/browser_info.cc
new file mode 100644
index 0000000000000000000000000000000000000000..808cd24dacedc0c263e5fe37103ebe6226de89fd
--- /dev/null
+++ b/chrome/test/chromedriver/chrome/browser_info.cc
@@ -0,0 +1,121 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/test/chromedriver/chrome/browser_info.h"
+
+#include "base/json/json_reader.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_split.h"
+#include "base/strings/string_util.h"
+#include "base/values.h"
+#include "chrome/test/chromedriver/chrome/version.h"
+
+BrowserInfo::BrowserInfo()
+ : browser_name(std::string()),
+ browser_version(std::string()),
+ build_no(kToTBuildNo),
+ blink_revision(kToTBlinkRevision) {
+}
+
+BrowserInfo::BrowserInfo(std::string browser_name,
+ std::string browser_version,
+ int build_no,
+ int blink_revision)
+ : browser_name(browser_name),
+ browser_version(browser_version),
+ build_no(build_no),
+ blink_revision(blink_revision) {
+}
+
+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");
+
+ std::string browser;
+ if (!dict->GetString("Browser", &browser)) {
+ return Status(kUnknownError,
+ "version info doesn't include string 'Browser'");
+ }
+
+ std::string blink_version;
+ if (!dict->GetString("WebKit-Version", &blink_version)) {
+ return Status(kUnknownError,
+ "version info doesn't include string 'WebKit-Version'");
+ }
+
+ Status status = ParseBrowserString(browser, &browser_info->browser_name,
+ &browser_info->browser_version, &browser_info->build_no);
+
+ if (status.IsError())
+ return status;
+
+ return 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 = "chrome";
+ *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 don't set |blink_revision|. For Chrome (and for
+ // Chrome OS) we use the build number instead of the blink revision for
+ // decisions about backwards compatibility.
+ 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;
+ return revision.size() == kGitHashLength
+ && base::ContainsOnlyChars(revision, "0123456789abcdefABCDEF");
+}

Powered by Google App Engine
This is Rietveld 408576698