Commit 4a5c47ed authored by Fabrice de Gans-Riberi's avatar Fabrice de Gans-Riberi Committed by Commit Bot

[fuchsia] SetNavigationEventListener() immediately sends a NavigationState.

Bug: 979049
Change-Id: Ifa277e8cf1a76ddd00d76abbf8ac392eb7d0b9f9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1704692Reviewed-by: default avatarWez <wez@chromium.org>
Commit-Queue: Fabrice de Gans-Riberi <fdegans@chromium.org>
Cr-Commit-Position: refs/heads/master@{#682900}
parent 5312e945
...@@ -1444,6 +1444,42 @@ IN_PROC_BROWSER_TEST_F(FrameImplTest, RecreateView) { ...@@ -1444,6 +1444,42 @@ IN_PROC_BROWSER_TEST_F(FrameImplTest, RecreateView) {
navigation_listener_.RunUntilUrlAndTitleEquals(page1_url, kPage1Title); navigation_listener_.RunUntilUrlAndTitleEquals(page1_url, kPage1Title);
} }
// Tests SetNavigationEventListener() immediately returns a NavigationEvent,
// even in the absence of a new navigation.
IN_PROC_BROWSER_TEST_F(FrameImplTest, ImmediateNavigationEvent) {
ASSERT_TRUE(embedded_test_server()->Start());
GURL page_url(embedded_test_server()->GetURL(kPage1Path));
// The first NavigationState received should be empty.
base::RunLoop run_loop;
navigation_listener_.SetBeforeAckHook(base::BindRepeating(
[](base::RunLoop* run_loop, const fuchsia::web::NavigationState& change,
OnNavigationStateChangedCallback callback) {
EXPECT_TRUE(change.IsEmpty());
run_loop->Quit();
callback();
},
base::Unretained(&run_loop)));
fuchsia::web::FramePtr frame = CreateFrame();
run_loop.Run();
navigation_listener_.SetBeforeAckHook({});
// Navigate to a page and wait for the navigation to complete.
fuchsia::web::NavigationControllerPtr controller;
frame->GetNavigationController(controller.NewRequest());
EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
controller.get(), fuchsia::web::LoadUrlParams(), page_url.spec()));
navigation_listener_.RunUntilUrlEquals(page_url);
// Attach a new navigation listener, we should get the new page state, even if
// no new navigation occurred.
cr_fuchsia::TestNavigationListener navigation_listener2;
fidl::Binding<fuchsia::web::NavigationEventListener>
navigation_listener_binding(&navigation_listener2);
frame->SetNavigationEventListener(navigation_listener_binding.NewBinding());
navigation_listener2.RunUntilUrlAndTitleEquals(page_url, kPage1Title);
}
class RequestMonitoringFrameImplBrowserTest : public FrameImplTest { class RequestMonitoringFrameImplBrowserTest : public FrameImplTest {
public: public:
RequestMonitoringFrameImplBrowserTest() = default; RequestMonitoringFrameImplBrowserTest() = default;
......
...@@ -62,12 +62,26 @@ void NavigationControllerImpl::SetEventListener( ...@@ -62,12 +62,26 @@ void NavigationControllerImpl::SetEventListener(
previous_navigation_state_ = {}; previous_navigation_state_ = {};
pending_navigation_event_ = {}; pending_navigation_event_ = {};
if (listener) { // Simply unbind if no new listener was set.
navigation_listener_.Bind(std::move(listener)); if (!listener) {
navigation_listener_.set_error_handler(
[this](zx_status_t status) { SetEventListener(nullptr); });
} else {
navigation_listener_.Unbind(); navigation_listener_.Unbind();
return;
}
navigation_listener_.Bind(std::move(listener));
navigation_listener_.set_error_handler(
[this](zx_status_t status) { SetEventListener(nullptr); });
// Immediately send the current navigation state, even if it is empty.
if (web_contents_->GetController().GetVisibleEntry() == nullptr) {
waiting_for_navigation_event_ack_ = true;
navigation_listener_->OnNavigationStateChanged(
fuchsia::web::NavigationState(), [this]() {
waiting_for_navigation_event_ack_ = false;
MaybeSendNavigationEvent();
});
} else {
OnNavigationEntryChanged();
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment