summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsamuong <samuong@chromium.org>2014-12-08 15:22:15 -0800
committerCommit bot <commit-bot@chromium.org>2014-12-08 23:23:04 +0000
commitf4b13bc95a983603a27bb0835adad1a9e3246810 (patch)
tree6988dfb4698aeb29cd0513e3fed9bc986b3b632d
parent5682e51e2356956bd3c774b2de20bc3b76505b8a (diff)
downloadchromium_src-f4b13bc95a983603a27bb0835adad1a9e3246810.zip
chromium_src-f4b13bc95a983603a27bb0835adad1a9e3246810.tar.gz
chromium_src-f4b13bc95a983603a27bb0835adad1a9e3246810.tar.bz2
[chromedriver] Reapply changes to NavigationTracker that were removed in r306882
This change was made for backwards compatibility and is no longer supported on desktop Chrome. But it is still required for WebView on Android 4.4 KitKat, which is based on M30. Also re-enabled ChromeDriverTest.testSwitchToParentFrame. BUG=chromedriver:994 TBR=stgao@chromium.org Review URL: https://codereview.chromium.org/783343002 Cr-Commit-Position: refs/heads/master@{#307374}
-rw-r--r--chrome/test/chromedriver/chrome/navigation_tracker.cc36
-rw-r--r--chrome/test/chromedriver/chrome/navigation_tracker.h10
-rw-r--r--chrome/test/chromedriver/chrome/navigation_tracker_unittest.cc50
-rw-r--r--chrome/test/chromedriver/chrome/web_view_impl.cc2
-rwxr-xr-xchrome/test/chromedriver/test/run_py_tests.py2
5 files changed, 76 insertions, 24 deletions
diff --git a/chrome/test/chromedriver/chrome/navigation_tracker.cc b/chrome/test/chromedriver/chrome/navigation_tracker.cc
index d9cf5a6..ed9ad87 100644
--- a/chrome/test/chromedriver/chrome/navigation_tracker.cc
+++ b/chrome/test/chromedriver/chrome/navigation_tracker.cc
@@ -6,19 +6,24 @@
#include "base/strings/stringprintf.h"
#include "base/values.h"
+#include "chrome/test/chromedriver/chrome/browser_info.h"
#include "chrome/test/chromedriver/chrome/devtools_client.h"
#include "chrome/test/chromedriver/chrome/status.h"
-NavigationTracker::NavigationTracker(DevToolsClient* client)
+NavigationTracker::NavigationTracker(DevToolsClient* client,
+ const BrowserInfo* browser_info)
: client_(client),
- loading_state_(kUnknown) {
+ loading_state_(kUnknown),
+ browser_info_(browser_info) {
client_->AddListener(this);
}
NavigationTracker::NavigationTracker(DevToolsClient* client,
- LoadingState known_state)
+ LoadingState known_state,
+ const BrowserInfo* browser_info)
: client_(client),
- loading_state_(known_state) {
+ loading_state_(known_state),
+ browser_info_(browser_info) {
client_->AddListener(this);
}
@@ -105,13 +110,34 @@ Status NavigationTracker::OnEvent(DevToolsClient* client,
pending_frame_set_.insert(frame_id);
loading_state_ = kLoading;
} else if (method == "Page.frameStoppedLoading") {
+ // Versions of Blink before revision 170248 sent a single
+ // Page.frameStoppedLoading event per page, but 170248 and newer revisions
+ // only send one event for each frame on the page.
+ //
+ // This change was rolled into the Chromium tree in revision 260203.
+ // Versions of Chrome with build number 1916 and earlier do not contain this
+ // change.
+ bool expecting_single_stop_event = false;
+
+ if (browser_info_->browser_name == "chrome") {
+ // If we're talking to a version of Chrome with an old build number, we
+ // are using a branched version of Blink which does not contain 170248
+ // (even if blink_revision > 170248).
+ expecting_single_stop_event = browser_info_->build_no <= 1916;
+ } else {
+ // If we're talking to a non-Chrome embedder (e.g. Content Shell, Android
+ // WebView), assume that the browser does not use a branched version of
+ // Blink.
+ expecting_single_stop_event = browser_info_->blink_revision < 170248;
+ }
+
std::string frame_id;
if (!params.GetString("frameId", &frame_id))
return Status(kUnknownError, "missing or invalid 'frameId'");
pending_frame_set_.erase(frame_id);
- if (pending_frame_set_.empty()) {
+ if (pending_frame_set_.empty() || expecting_single_stop_event) {
pending_frame_set_.clear();
loading_state_ = kNotLoading;
}
diff --git a/chrome/test/chromedriver/chrome/navigation_tracker.h b/chrome/test/chromedriver/chrome/navigation_tracker.h
index 56b8d9b..a75a094 100644
--- a/chrome/test/chromedriver/chrome/navigation_tracker.h
+++ b/chrome/test/chromedriver/chrome/navigation_tracker.h
@@ -18,6 +18,7 @@ namespace base {
class DictionaryValue;
}
+struct BrowserInfo;
class DevToolsClient;
class Status;
@@ -30,8 +31,12 @@ class NavigationTracker : public DevToolsEventListener {
kNotLoading,
};
- explicit NavigationTracker(DevToolsClient* client);
- NavigationTracker(DevToolsClient* client, LoadingState known_state);
+ NavigationTracker(DevToolsClient* client, const BrowserInfo* browser_info);
+
+ NavigationTracker(DevToolsClient* client,
+ LoadingState known_state,
+ const BrowserInfo* browser_info);
+
~NavigationTracker() override;
// Gets whether a navigation is pending for the specified frame. |frame_id|
@@ -49,6 +54,7 @@ class NavigationTracker : public DevToolsEventListener {
private:
DevToolsClient* client_;
LoadingState loading_state_;
+ const BrowserInfo* browser_info_;
std::set<std::string> pending_frame_set_;
std::set<std::string> scheduled_frame_set_;
diff --git a/chrome/test/chromedriver/chrome/navigation_tracker_unittest.cc b/chrome/test/chromedriver/chrome/navigation_tracker_unittest.cc
index e7c8c5d..2fd2fc8 100644
--- a/chrome/test/chromedriver/chrome/navigation_tracker_unittest.cc
+++ b/chrome/test/chromedriver/chrome/navigation_tracker_unittest.cc
@@ -7,6 +7,7 @@
#include "base/compiler_specific.h"
#include "base/json/json_reader.h"
#include "base/values.h"
+#include "chrome/test/chromedriver/chrome/browser_info.h"
#include "chrome/test/chromedriver/chrome/navigation_tracker.h"
#include "chrome/test/chromedriver/chrome/status.h"
#include "chrome/test/chromedriver/chrome/stub_devtools_client.h"
@@ -26,7 +27,8 @@ void AssertPendingState(NavigationTracker* tracker,
TEST(NavigationTracker, FrameLoadStartStop) {
StubDevToolsClient client;
- NavigationTracker tracker(&client);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(&client, &browser_info);
base::DictionaryValue params;
params.SetString("frameId", "f");
@@ -44,7 +46,8 @@ TEST(NavigationTracker, FrameLoadStartStop) {
// Page.frameStoppedLoading event.
TEST(NavigationTracker, FrameLoadStartStartStop) {
StubDevToolsClient client;
- NavigationTracker tracker(&client);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(&client, &browser_info);
base::DictionaryValue params;
params.SetString("frameId", "f");
@@ -62,7 +65,8 @@ TEST(NavigationTracker, FrameLoadStartStartStop) {
TEST(NavigationTracker, MultipleFramesLoad) {
StubDevToolsClient client;
- NavigationTracker tracker(&client);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(&client, &browser_info);
base::DictionaryValue params;
// pending_frames_set_.size() == 0
@@ -99,7 +103,9 @@ TEST(NavigationTracker, MultipleFramesLoad) {
TEST(NavigationTracker, NavigationScheduledThenLoaded) {
StubDevToolsClient client;
- NavigationTracker tracker(&client, NavigationTracker::kNotLoading);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(
+ &client, NavigationTracker::kNotLoading, &browser_info);
base::DictionaryValue params;
params.SetString("frameId", "f");
base::DictionaryValue params_scheduled;
@@ -126,7 +132,9 @@ TEST(NavigationTracker, NavigationScheduledThenLoaded) {
TEST(NavigationTracker, NavigationScheduledForOtherFrame) {
StubDevToolsClient client;
- NavigationTracker tracker(&client, NavigationTracker::kNotLoading);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(
+ &client, NavigationTracker::kNotLoading, &browser_info);
base::DictionaryValue params_scheduled;
params_scheduled.SetInteger("delay", 0);
params_scheduled.SetString("frameId", "other");
@@ -140,7 +148,9 @@ TEST(NavigationTracker, NavigationScheduledForOtherFrame) {
TEST(NavigationTracker, NavigationScheduledThenCancelled) {
StubDevToolsClient client;
- NavigationTracker tracker(&client, NavigationTracker::kNotLoading);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(
+ &client, NavigationTracker::kNotLoading, &browser_info);
base::DictionaryValue params;
params.SetString("frameId", "f");
base::DictionaryValue params_scheduled;
@@ -161,7 +171,9 @@ TEST(NavigationTracker, NavigationScheduledThenCancelled) {
TEST(NavigationTracker, NavigationScheduledTooFarAway) {
StubDevToolsClient client;
- NavigationTracker tracker(&client, NavigationTracker::kNotLoading);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(
+ &client, NavigationTracker::kNotLoading, &browser_info);
base::DictionaryValue params_scheduled;
params_scheduled.SetInteger("delay", 10);
@@ -175,7 +187,9 @@ TEST(NavigationTracker, NavigationScheduledTooFarAway) {
TEST(NavigationTracker, DiscardScheduledNavigationsOnMainFrameCommit) {
StubDevToolsClient client;
- NavigationTracker tracker(&client, NavigationTracker::kNotLoading);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(
+ &client, NavigationTracker::kNotLoading, &browser_info);
base::DictionaryValue params_scheduled;
params_scheduled.SetString("frameId", "subframe");
@@ -230,7 +244,8 @@ class FailToEvalScriptDevToolsClient : public StubDevToolsClient {
TEST(NavigationTracker, UnknownStateFailsToDetermineState) {
FailToEvalScriptDevToolsClient client;
- NavigationTracker tracker(&client);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(&client, &browser_info);
bool is_pending;
ASSERT_EQ(kUnknownError,
tracker.IsPendingNavigation("f", &is_pending).code());
@@ -292,7 +307,8 @@ TEST(NavigationTracker, UnknownStatePageNotLoadAtAll) {
base::DictionaryValue params;
DeterminingLoadStateDevToolsClient client(
true, true, std::string(), &params);
- NavigationTracker tracker(&client);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(&client, &browser_info);
ASSERT_NO_FATAL_FAILURE(AssertPendingState(&tracker, "f", true));
}
@@ -300,7 +316,8 @@ TEST(NavigationTracker, UnknownStateForcesStart) {
base::DictionaryValue params;
DeterminingLoadStateDevToolsClient client(
false, true, std::string(), &params);
- NavigationTracker tracker(&client);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(&client, &browser_info);
ASSERT_NO_FATAL_FAILURE(AssertPendingState(&tracker, "f", true));
}
@@ -309,7 +326,8 @@ TEST(NavigationTracker, UnknownStateForcesStartReceivesStop) {
params.SetString("frameId", "f");
DeterminingLoadStateDevToolsClient client(
false, true, "Page.frameStoppedLoading", &params);
- NavigationTracker tracker(&client);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(&client, &browser_info);
ASSERT_NO_FATAL_FAILURE(AssertPendingState(&tracker, "f", false));
}
@@ -318,7 +336,9 @@ TEST(NavigationTracker, OnSuccessfulNavigate) {
params.SetString("frameId", "f");
DeterminingLoadStateDevToolsClient client(
false, true, "Page.frameStoppedLoading", &params);
- NavigationTracker tracker(&client, NavigationTracker::kNotLoading);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(
+ &client, NavigationTracker::kNotLoading, &browser_info);
tracker.OnCommandSuccess(&client, "Page.navigate");
ASSERT_NO_FATAL_FAILURE(AssertPendingState(&tracker, "f", false));
}
@@ -328,7 +348,9 @@ TEST(NavigationTracker, OnSuccessfulNavigateStillWaiting) {
params.SetString("frameId", "f");
DeterminingLoadStateDevToolsClient client(
false, true, std::string(), &params);
- NavigationTracker tracker(&client, NavigationTracker::kNotLoading);
+ BrowserInfo browser_info;
+ NavigationTracker tracker(
+ &client, NavigationTracker::kNotLoading, &browser_info);
tracker.OnCommandSuccess(&client, "Page.navigate");
ASSERT_NO_FATAL_FAILURE(AssertPendingState(&tracker, "f", true));
}
diff --git a/chrome/test/chromedriver/chrome/web_view_impl.cc b/chrome/test/chromedriver/chrome/web_view_impl.cc
index 3acae95..d703b4e 100644
--- a/chrome/test/chromedriver/chrome/web_view_impl.cc
+++ b/chrome/test/chromedriver/chrome/web_view_impl.cc
@@ -121,7 +121,7 @@ WebViewImpl::WebViewImpl(const std::string& id,
browser_info_(browser_info),
dom_tracker_(new DomTracker(client.get())),
frame_tracker_(new FrameTracker(client.get())),
- navigation_tracker_(new NavigationTracker(client.get())),
+ navigation_tracker_(new NavigationTracker(client.get(), browser_info)),
dialog_manager_(new JavaScriptDialogManager(client.get())),
mobile_emulation_override_manager_(
new MobileEmulationOverrideManager(client.get(), device_metrics)),
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index 22e59f8..7d8e74b 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -151,8 +151,6 @@ _ANDROID_NEGATIVE_FILTER['chromedriver_webview_shell'] = (
# https://code.google.com/p/chromedriver/issues/detail?id=913
'ChromeDriverTest.testChromeDriverSendLargeData',
'PerformanceLoggerTest.testPerformanceLogger',
- # https://code.google.com/p/chromedriver/issues/detail?id=994
- 'ChromeDriverTest.testSwitchToParentFrame',
]
)