Skip to content

Commit

Permalink
Adds IsRendererInitiated to NavigationContext.
Browse files Browse the repository at this point in the history
This mimics content/public/browser/navigation_handle.h. IsRenderInitiated will return true if the current navigation was initiated by the renderer, and false if it was user initiated.

Bug: 
Change-Id: I094442e501a17a4741edca228810533e4b08253f
Reviewed-on: https://chromium-review.googlesource.com/646660
Commit-Queue: Marc-Antoine Courteau <[email protected]>
Reviewed-by: Rohit Rao (ping after 24h) <[email protected]>
Reviewed-by: Kurt Horimoto <[email protected]>
Cr-Commit-Position: refs/heads/master@{#499188}
  • Loading branch information
macourteau authored and Commit Bot committed Sep 1, 2017
1 parent 5acc0a0 commit c6d5144
Show file tree
Hide file tree
Showing 14 changed files with 83 additions and 28 deletions.
4 changes: 2 additions & 2 deletions ios/chrome/browser/tabs/tab_unittest.mm
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ void BrowseTo(const GURL& userUrl, const GURL& redirectUrl, NSString* title) {
std::unique_ptr<web::NavigationContext> context1 =
web::NavigationContextImpl::CreateNavigationContext(
web_state_impl_.get(), userUrl,
ui::PageTransition::PAGE_TRANSITION_TYPED);
ui::PageTransition::PAGE_TRANSITION_TYPED, false);
web_state_impl_->OnNavigationStarted(context1.get());
[tab_ webWillAddPendingURL:redirectUrl
transition:ui::PAGE_TRANSITION_CLIENT_REDIRECT];
Expand All @@ -231,7 +231,7 @@ void BrowseTo(const GURL& userUrl, const GURL& redirectUrl, NSString* title) {
std::unique_ptr<web::NavigationContext> context2 =
web::NavigationContextImpl::CreateNavigationContext(
web_state_impl_.get(), redirectUrl,
ui::PageTransition::PAGE_TRANSITION_TYPED);
ui::PageTransition::PAGE_TRANSITION_TYPED, false);
web_state_impl_->OnNavigationStarted(context2.get());
[tab_ navigationManagerImpl]->CommitPendingItem();
web_state_impl_->UpdateHttpResponseHeaders(redirectUrl);
Expand Down
4 changes: 2 additions & 2 deletions ios/web/public/test/fakes/crw_test_web_state_observer.mm
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ - (void)webState:(web::WebState*)webState
std::unique_ptr<web::NavigationContextImpl> context =
web::NavigationContextImpl::CreateNavigationContext(
navigation->GetWebState(), navigation->GetUrl(),
navigation->GetPageTransition());
navigation->GetPageTransition(), navigation->IsRendererInitiated());
context->SetIsSameDocument(navigation->IsSameDocument());
context->SetError(navigation->GetError());
_didStartNavigationInfo->context = std::move(context);
Expand All @@ -175,7 +175,7 @@ - (void)webState:(web::WebState*)webState
std::unique_ptr<web::NavigationContextImpl> context =
web::NavigationContextImpl::CreateNavigationContext(
navigation->GetWebState(), navigation->GetUrl(),
navigation->GetPageTransition());
navigation->GetPageTransition(), navigation->IsRendererInitiated());
context->SetIsSameDocument(navigation->IsSameDocument());
context->SetError(navigation->GetError());
_didFinishNavigationInfo->context = std::move(context);
Expand Down
1 change: 1 addition & 0 deletions ios/web/public/test/fakes/fake_navigation_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class FakeNavigationContext : public NavigationContext {
bool IsPost() const override;
NSError* GetError() const override;
net::HttpResponseHeaders* GetResponseHeaders() const override;
bool IsRendererInitiated() const override;

// Setters for navigation context data members.
void SetResponseHeaders(
Expand Down
4 changes: 4 additions & 0 deletions ios/web/public/test/fakes/fake_navigation_context.mm
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@
return response_headers_.get();
}

bool FakeNavigationContext::IsRendererInitiated() const {
return false;
}

void FakeNavigationContext::SetResponseHeaders(
const scoped_refptr<net::HttpResponseHeaders>& response_headers) {
response_headers_ = response_headers;
Expand Down
4 changes: 2 additions & 2 deletions ios/web/public/test/fakes/test_web_state_observer.mm
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@
std::unique_ptr<web::NavigationContextImpl> context =
web::NavigationContextImpl::CreateNavigationContext(
navigation->GetWebState(), navigation->GetUrl(),
navigation->GetPageTransition());
navigation->GetPageTransition(), navigation->IsRendererInitiated());
context->SetIsSameDocument(navigation->IsSameDocument());
context->SetError(navigation->GetError());
did_start_navigation_info_->context = std::move(context);
Expand All @@ -94,7 +94,7 @@
std::unique_ptr<web::NavigationContextImpl> context =
web::NavigationContextImpl::CreateNavigationContext(
navigation->GetWebState(), navigation->GetUrl(),
navigation->GetPageTransition());
navigation->GetPageTransition(), navigation->IsRendererInitiated());
context->SetIsSameDocument(navigation->IsSameDocument());
context->SetError(navigation->GetError());
did_finish_navigation_info_->context = std::move(context);
Expand Down
8 changes: 8 additions & 0 deletions ios/web/public/web_state/navigation_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,14 @@ class NavigationContext {
// returned should not be modified, as modifications will not be reflected.
virtual net::HttpResponseHeaders* GetResponseHeaders() const = 0;

// Whether the navigation was initiated by the renderer process. Examples of
// renderer-initiated navigations include:
// * <a> link click
// * changing window.location.href
// * redirect via the <meta http-equiv="refresh"> tag
// * using window.history.pushState
virtual bool IsRendererInitiated() const = 0;

virtual ~NavigationContext() {}
};

Expand Down
9 changes: 7 additions & 2 deletions ios/web/web_state/navigation_context_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ class NavigationContextImpl : public NavigationContext {
static std::unique_ptr<NavigationContextImpl> CreateNavigationContext(
WebState* web_state,
const GURL& url,
ui::PageTransition page_transition);
ui::PageTransition page_transition,
bool is_renderer_initiated);

#ifndef NDEBUG
// Returns human readable description of this object.
Expand All @@ -38,6 +39,7 @@ class NavigationContextImpl : public NavigationContext {
bool IsPost() const override;
NSError* GetError() const override;
net::HttpResponseHeaders* GetResponseHeaders() const override;
bool IsRendererInitiated() const override;
~NavigationContextImpl() override;

// Setters for navigation context data members.
Expand All @@ -46,6 +48,7 @@ class NavigationContextImpl : public NavigationContext {
void SetError(NSError* error);
void SetResponseHeaders(
const scoped_refptr<net::HttpResponseHeaders>& response_headers);
void SetIsRendererInitiated(bool is_renderer_initiated);

// Optional unique id of the navigation item associated with this navigaiton.
int GetNavigationItemUniqueID() const;
Expand All @@ -54,7 +57,8 @@ class NavigationContextImpl : public NavigationContext {
private:
NavigationContextImpl(WebState* web_state,
const GURL& url,
ui::PageTransition page_transition);
ui::PageTransition page_transition,
bool is_renderer_initiated);

WebState* web_state_ = nullptr;
GURL url_;
Expand All @@ -63,6 +67,7 @@ class NavigationContextImpl : public NavigationContext {
bool is_post_ = false;
base::scoped_nsobject<NSError> error_;
scoped_refptr<net::HttpResponseHeaders> response_headers_;
bool is_renderer_initiated_ = false;
int navigation_item_unique_id_ = -1;

DISALLOW_COPY_AND_ASSIGN(NavigationContextImpl);
Expand Down
21 changes: 16 additions & 5 deletions ios/web/web_state/navigation_context_impl.mm
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,10 @@
NavigationContextImpl::CreateNavigationContext(
WebState* web_state,
const GURL& url,
ui::PageTransition page_transition) {
std::unique_ptr<NavigationContextImpl> result(
new NavigationContextImpl(web_state, url, page_transition));
ui::PageTransition page_transition,
bool is_renderer_initiated) {
std::unique_ptr<NavigationContextImpl> result(new NavigationContextImpl(
web_state, url, page_transition, is_renderer_initiated));
return result;
}

Expand Down Expand Up @@ -64,6 +65,10 @@
return response_headers_.get();
}

bool NavigationContextImpl::IsRendererInitiated() const {
return is_renderer_initiated_;
}

void NavigationContextImpl::SetIsSameDocument(bool is_same_document) {
is_same_document_ = is_same_document;
}
Expand All @@ -81,6 +86,10 @@
response_headers_ = response_headers;
}

void NavigationContextImpl::SetIsRendererInitiated(bool is_renderer_initiated) {
is_renderer_initiated_ = is_renderer_initiated;
}

int NavigationContextImpl::GetNavigationItemUniqueID() const {
return navigation_item_unique_id_;
}
Expand All @@ -91,13 +100,15 @@

NavigationContextImpl::NavigationContextImpl(WebState* web_state,
const GURL& url,
ui::PageTransition page_transition)
ui::PageTransition page_transition,
bool is_renderer_initiated)
: web_state_(web_state),
url_(url),
page_transition_(page_transition),
is_same_document_(false),
error_(nil),
response_headers_(nullptr) {}
response_headers_(nullptr),
is_renderer_initiated_(is_renderer_initiated) {}

NavigationContextImpl::~NavigationContextImpl() = default;

Expand Down
20 changes: 18 additions & 2 deletions ios/web/web_state/navigation_context_impl_unittest.mm
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@
TEST_F(NavigationContextImplTest, NavigationContext) {
std::unique_ptr<NavigationContext> context =
NavigationContextImpl::CreateNavigationContext(
&web_state_, url_, ui::PageTransition::PAGE_TRANSITION_FORWARD_BACK);
&web_state_, url_, ui::PageTransition::PAGE_TRANSITION_FORWARD_BACK,
true);
ASSERT_TRUE(context);

EXPECT_EQ(&web_state_, context->GetWebState());
Expand All @@ -49,32 +50,37 @@
EXPECT_FALSE(context->IsSameDocument());
EXPECT_FALSE(context->GetError());
EXPECT_FALSE(context->GetResponseHeaders());
EXPECT_TRUE(context->IsRendererInitiated());
}

// Tests NavigationContextImpl Setters.
TEST_F(NavigationContextImplTest, Setters) {
std::unique_ptr<NavigationContextImpl> context =
NavigationContextImpl::CreateNavigationContext(
&web_state_, url_, ui::PageTransition::PAGE_TRANSITION_FORWARD_BACK);
&web_state_, url_, ui::PageTransition::PAGE_TRANSITION_FORWARD_BACK,
false);
ASSERT_TRUE(context);

ASSERT_FALSE(context->IsSameDocument());
ASSERT_FALSE(context->IsPost());
ASSERT_FALSE(context->GetError());
ASSERT_FALSE(context->IsRendererInitiated());
ASSERT_NE(response_headers_.get(), context->GetResponseHeaders());

// SetSameDocument
context->SetIsSameDocument(true);
EXPECT_TRUE(context->IsSameDocument());
ASSERT_FALSE(context->IsPost());
EXPECT_FALSE(context->GetError());
EXPECT_FALSE(context->IsRendererInitiated());
EXPECT_NE(response_headers_.get(), context->GetResponseHeaders());

// SetPost
context->SetIsPost(true);
EXPECT_TRUE(context->IsSameDocument());
ASSERT_TRUE(context->IsPost());
EXPECT_FALSE(context->GetError());
EXPECT_FALSE(context->IsRendererInitiated());
EXPECT_NE(response_headers_.get(), context->GetResponseHeaders());

// SetErrorPage
Expand All @@ -83,13 +89,23 @@
EXPECT_TRUE(context->IsSameDocument());
ASSERT_TRUE(context->IsPost());
EXPECT_EQ(error, context->GetError());
EXPECT_FALSE(context->IsRendererInitiated());
EXPECT_NE(response_headers_.get(), context->GetResponseHeaders());

// SetResponseHeaders
context->SetResponseHeaders(response_headers_);
EXPECT_TRUE(context->IsSameDocument());
ASSERT_TRUE(context->IsPost());
EXPECT_EQ(error, context->GetError());
EXPECT_FALSE(context->IsRendererInitiated());
EXPECT_EQ(response_headers_.get(), context->GetResponseHeaders());

// SetIsRendererInitiated
context->SetIsRendererInitiated(true);
EXPECT_TRUE(context->IsSameDocument());
ASSERT_TRUE(context->IsPost());
EXPECT_EQ(error, context->GetError());
EXPECT_TRUE(context->IsRendererInitiated());
EXPECT_EQ(response_headers_.get(), context->GetResponseHeaders());
}

Expand Down
18 changes: 12 additions & 6 deletions ios/web/web_state/ui/crw_web_controller.mm
Original file line number Diff line number Diff line change
Expand Up @@ -1279,8 +1279,8 @@ - (void)pushStateWithPageURL:(const GURL&)pageURL
stateObject:(NSString*)stateObject
transition:(ui::PageTransition)transition {
std::unique_ptr<web::NavigationContextImpl> context =
web::NavigationContextImpl::CreateNavigationContext(_webStateImpl,
pageURL, transition);
web::NavigationContextImpl::CreateNavigationContext(
_webStateImpl, pageURL, transition, true);
context->SetIsSameDocument(true);
_webStateImpl->OnNavigationStarted(context.get());
[[self sessionController] pushNewItemWithURL:pageURL
Expand All @@ -1295,7 +1295,7 @@ - (void)replaceStateWithPageURL:(const GURL&)pageURL
std::unique_ptr<web::NavigationContextImpl> context =
web::NavigationContextImpl::CreateNavigationContext(
_webStateImpl, pageURL,
ui::PageTransition::PAGE_TRANSITION_CLIENT_REDIRECT);
ui::PageTransition::PAGE_TRANSITION_CLIENT_REDIRECT, true);
context->SetIsSameDocument(true);
_webStateImpl->OnNavigationStarted(context.get());
[[self sessionController] updateCurrentItemWithURL:pageURL
Expand Down Expand Up @@ -1438,10 +1438,16 @@ - (double)loadingProgress {

[_delegate webWillAddPendingURL:requestURL transition:transition];
// Add or update pending url.
if (self.navigationManagerImpl->GetPendingItem()) {
bool isRendererInitiated = true;
web::NavigationItem* pendingItem =
self.navigationManagerImpl->GetPendingItem();
if (pendingItem) {
// Update the existing pending entry.
// Typically on PAGE_TRANSITION_CLIENT_REDIRECT.
self.navigationManagerImpl->UpdatePendingItemUrl(requestURL);
isRendererInitiated = static_cast<web::NavigationItemImpl*>(pendingItem)
->NavigationInitiationType() ==
web::NavigationInitiationType::RENDERER_INITIATED;
} else {
// A new session history entry needs to be created.
self.navigationManagerImpl->AddPendingItem(
Expand All @@ -1451,7 +1457,7 @@ - (double)loadingProgress {
}
std::unique_ptr<web::NavigationContextImpl> context =
web::NavigationContextImpl::CreateNavigationContext(
_webStateImpl, requestURL, transition);
_webStateImpl, requestURL, transition, isRendererInitiated);

web::NavigationItem* item = self.navigationManagerImpl->GetPendingItem();
// TODO(crbug.com/676129): AddPendingItem does not always create a pending
Expand Down Expand Up @@ -4018,7 +4024,7 @@ - (void)loadHTML:(NSString*)HTML forURL:(const GURL&)URL {
// should not be treated as a navigation, but WKNavigationDelegate callbacks
// still expect a valid context.
context = web::NavigationContextImpl::CreateNavigationContext(
_webStateImpl, URL, loadHTMLTransition);
_webStateImpl, URL, loadHTMLTransition, false);
} else {
context = [self registerLoadRequestForURL:URL
referrer:web::Referrer()
Expand Down
10 changes: 7 additions & 3 deletions ios/web/web_state/ui/crw_wk_navigation_states_unittest.mm
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@
std::unique_ptr<web::NavigationContextImpl> context =
NavigationContextImpl::CreateNavigationContext(
nullptr /*web_state*/, GURL(kTestUrl1),
ui::PageTransition::PAGE_TRANSITION_SERVER_REDIRECT);
ui::PageTransition::PAGE_TRANSITION_SERVER_REDIRECT, true);
[states_ setContext:std::move(context) forNavigation:navigation3_];
EXPECT_EQ(navigation3_, [states_ lastAddedNavigation]);
EXPECT_EQ(WKNavigationState::NONE, [states_ lastAddedNavigationState]);
Expand All @@ -101,7 +101,7 @@
std::unique_ptr<web::NavigationContextImpl> context1 =
NavigationContextImpl::CreateNavigationContext(
nullptr /*web_state*/, GURL(kTestUrl1),
ui::PageTransition::PAGE_TRANSITION_RELOAD);
ui::PageTransition::PAGE_TRANSITION_RELOAD, false);
context1->SetIsSameDocument(true);
[states_ setContext:std::move(context1) forNavigation:navigation1_];
EXPECT_FALSE([states_ contextForNavigation:navigation2_]);
Expand All @@ -111,12 +111,14 @@
[states_ contextForNavigation:navigation1_]->GetUrl());
EXPECT_TRUE([states_ contextForNavigation:navigation1_]->IsSameDocument());
EXPECT_FALSE([states_ contextForNavigation:navigation1_]->GetError());
EXPECT_FALSE(
[states_ contextForNavigation:navigation1_]->IsRendererInitiated());

// Replace existing context.
std::unique_ptr<web::NavigationContextImpl> context2 =
NavigationContextImpl::CreateNavigationContext(
nullptr /*web_state*/, GURL(kTestUrl2),
ui::PageTransition::PAGE_TRANSITION_GENERATED);
ui::PageTransition::PAGE_TRANSITION_GENERATED, true);
NSError* error = [[NSError alloc] init];
context2->SetError(error);
[states_ setContext:std::move(context2) forNavigation:navigation1_];
Expand All @@ -127,6 +129,8 @@
[states_ contextForNavigation:navigation1_]->GetUrl());
EXPECT_FALSE([states_ contextForNavigation:navigation1_]->IsSameDocument());
EXPECT_EQ(error, [states_ contextForNavigation:navigation1_]->GetError());
EXPECT_TRUE(
[states_ contextForNavigation:navigation1_]->IsRendererInitiated());
}

// Tests null WKNavigation object.
Expand Down
2 changes: 1 addition & 1 deletion ios/web/web_state/web_state_impl_unittest.mm
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ bool HandleScriptCommand(bool* is_called,
std::unique_ptr<web::NavigationContext> context =
NavigationContextImpl::CreateNavigationContext(
web_state_.get(), url,
ui::PageTransition::PAGE_TRANSITION_AUTO_BOOKMARK);
ui::PageTransition::PAGE_TRANSITION_AUTO_BOOKMARK, true);
web_state_->OnNavigationFinished(context.get());
ASSERT_TRUE(observer->did_finish_navigation_info());
EXPECT_EQ(web_state_.get(),
Expand Down
4 changes: 2 additions & 2 deletions ios/web/web_state/web_state_observer_bridge_unittest.mm
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
std::unique_ptr<web::NavigationContext> context =
web::NavigationContextImpl::CreateNavigationContext(
&test_web_state_, url,
ui::PageTransition::PAGE_TRANSITION_FORWARD_BACK);
ui::PageTransition::PAGE_TRANSITION_FORWARD_BACK, false);
bridge_->DidStartNavigation(context.get());

ASSERT_TRUE([observer_ didStartNavigationInfo]);
Expand All @@ -87,7 +87,7 @@
std::unique_ptr<web::NavigationContext> context =
web::NavigationContextImpl::CreateNavigationContext(
&test_web_state_, url,
ui::PageTransition::PAGE_TRANSITION_FROM_ADDRESS_BAR);
ui::PageTransition::PAGE_TRANSITION_FROM_ADDRESS_BAR, false);
bridge_->DidFinishNavigation(context.get());

ASSERT_TRUE([observer_ didFinishNavigationInfo]);
Expand Down
2 changes: 1 addition & 1 deletion ios/web/webui/crw_web_ui_manager_unittest.mm
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ void SetUp() override {
std::unique_ptr<web::NavigationContext> context =
NavigationContextImpl::CreateNavigationContext(
web_state_impl_.get(), url,
ui::PageTransition::PAGE_TRANSITION_AUTO_BOOKMARK);
ui::PageTransition::PAGE_TRANSITION_AUTO_BOOKMARK, true);
web_state_impl_->OnNavigationStarted(context.get());
}

Expand Down

0 comments on commit c6d5144

Please sign in to comment.