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

Unified Diff: ios/web/navigation/navigation_manager_impl.mm

Issue 2944093002: Extract NavigationManagerImpl interface for navigation experiment. (Closed)
Patch Set: Patch for landing Created 3 years, 6 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: ios/web/navigation/navigation_manager_impl.mm
diff --git a/ios/web/navigation/navigation_manager_impl.mm b/ios/web/navigation/navigation_manager_impl.mm
deleted file mode 100644
index 46f7e407b98a18cecf4850e256a2c44e3b3414e7..0000000000000000000000000000000000000000
--- a/ios/web/navigation/navigation_manager_impl.mm
+++ /dev/null
@@ -1,449 +0,0 @@
-// Copyright 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.
-
-#import "ios/web/navigation/navigation_manager_impl.h"
-
-#include <stddef.h>
-
-#include <utility>
-
-#include "base/logging.h"
-#import "ios/web/navigation/crw_session_controller+private_constructors.h"
-#import "ios/web/navigation/crw_session_controller.h"
-#import "ios/web/navigation/navigation_item_impl.h"
-#import "ios/web/navigation/navigation_item_impl_list.h"
-#import "ios/web/navigation/navigation_manager_delegate.h"
-#include "ios/web/public/load_committed_details.h"
-#import "ios/web/public/navigation_item.h"
-#include "ios/web/public/reload_type.h"
-#import "ios/web/public/web_client.h"
-#import "ios/web/public/web_state/web_state.h"
-#include "ui/base/page_transition_types.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace {
-
-// Checks whether or not two URL are an in-page navigation (differing only
-// in the fragment).
-bool AreURLsInPageNavigation(const GURL& existing_url, const GURL& new_url) {
- if (existing_url == new_url || !new_url.has_ref())
- return false;
-
- return existing_url.EqualsIgnoringRef(new_url);
-}
-
-} // anonymous namespace
-
-namespace web {
-
-NavigationManager::WebLoadParams::WebLoadParams(const GURL& url)
- : url(url),
- transition_type(ui::PAGE_TRANSITION_LINK),
- user_agent_override_option(UserAgentOverrideOption::INHERIT),
- is_renderer_initiated(false),
- post_data(nil) {}
-
-NavigationManager::WebLoadParams::~WebLoadParams() {}
-
-NavigationManager::WebLoadParams::WebLoadParams(const WebLoadParams& other)
- : url(other.url),
- referrer(other.referrer),
- transition_type(other.transition_type),
- user_agent_override_option(other.user_agent_override_option),
- is_renderer_initiated(other.is_renderer_initiated),
- extra_headers([other.extra_headers copy]),
- post_data([other.post_data copy]) {}
-
-NavigationManager::WebLoadParams& NavigationManager::WebLoadParams::operator=(
- const WebLoadParams& other) {
- url = other.url;
- referrer = other.referrer;
- is_renderer_initiated = other.is_renderer_initiated;
- transition_type = other.transition_type;
- user_agent_override_option = other.user_agent_override_option;
- extra_headers.reset([other.extra_headers copy]);
- post_data.reset([other.post_data copy]);
-
- return *this;
-}
-
-NavigationManagerImpl::NavigationManagerImpl()
- : delegate_(nullptr), browser_state_(nullptr) {}
-
-NavigationManagerImpl::~NavigationManagerImpl() {
- [session_controller_ setNavigationManager:nullptr];
-}
-
-void NavigationManagerImpl::SetDelegate(NavigationManagerDelegate* delegate) {
- delegate_ = delegate;
-}
-
-void NavigationManagerImpl::SetBrowserState(BrowserState* browser_state) {
- browser_state_ = browser_state;
- [session_controller_ setBrowserState:browser_state];
-}
-
-void NavigationManagerImpl::SetSessionController(
- CRWSessionController* session_controller) {
- session_controller_.reset(session_controller);
- [session_controller_ setNavigationManager:this];
-}
-
-void NavigationManagerImpl::InitializeSession() {
- SetSessionController(
- [[CRWSessionController alloc] initWithBrowserState:browser_state_]);
-}
-
-void NavigationManagerImpl::ReplaceSessionHistory(
- std::vector<std::unique_ptr<web::NavigationItem>> items,
- int lastCommittedItemIndex) {
- SetSessionController([[CRWSessionController alloc]
- initWithBrowserState:browser_state_
- navigationItems:std::move(items)
- lastCommittedItemIndex:lastCommittedItemIndex]);
-}
-
-void NavigationManagerImpl::OnNavigationItemsPruned(size_t pruned_item_count) {
- delegate_->OnNavigationItemsPruned(pruned_item_count);
-}
-
-void NavigationManagerImpl::OnNavigationItemChanged() {
- delegate_->OnNavigationItemChanged();
-}
-
-void NavigationManagerImpl::OnNavigationItemCommitted() {
- LoadCommittedDetails details;
- details.item = GetLastCommittedItem();
- DCHECK(details.item);
- details.previous_item_index = [session_controller_ previousItemIndex];
- if (details.previous_item_index >= 0) {
- DCHECK([session_controller_ previousItem]);
- details.previous_url = [session_controller_ previousItem]->GetURL();
- details.is_in_page =
- AreURLsInPageNavigation(details.previous_url, details.item->GetURL());
- } else {
- details.previous_url = GURL();
- details.is_in_page = NO;
- }
-
- delegate_->OnNavigationItemCommitted(details);
-}
-
-CRWSessionController* NavigationManagerImpl::GetSessionController() {
- return session_controller_;
-}
-
-void NavigationManagerImpl::AddTransientItem(const GURL& url) {
- [session_controller_ addTransientItemWithURL:url];
-
- // TODO(crbug.com/676129): Transient item is only supposed to be added for
- // pending non-app-specific loads, but pending item can be null because of the
- // bug. The workaround should be removed once the bug is fixed.
- NavigationItem* item = GetPendingItem();
- if (!item)
- item = GetLastCommittedNonAppSpecificItem();
- DCHECK(item->GetUserAgentType() != UserAgentType::NONE);
- GetTransientItem()->SetUserAgentType(item->GetUserAgentType());
-}
-
-void NavigationManagerImpl::AddPendingItem(
- const GURL& url,
- const web::Referrer& referrer,
- ui::PageTransition navigation_type,
- NavigationInitiationType initiation_type,
- UserAgentOverrideOption user_agent_override_option) {
- [session_controller_ addPendingItem:url
- referrer:referrer
- transition:navigation_type
- initiationType:initiation_type
- userAgentOverrideOption:user_agent_override_option];
-
- // Set the user agent type for web URLs.
- NavigationItem* pending_item = GetPendingItem();
- if (!pending_item)
- return;
-
- // |user_agent_override_option| must be INHERIT if |pending_item|'s
- // UserAgentType is NONE, as requesting a desktop or mobile user agent should
- // be disabled for app-specific URLs.
- DCHECK(pending_item->GetUserAgentType() != UserAgentType::NONE ||
- user_agent_override_option == UserAgentOverrideOption::INHERIT);
-
- // Newly created pending items are created with UserAgentType::NONE for native
- // pages or UserAgentType::MOBILE for non-native pages. If the pending item's
- // URL is non-native, check which user agent type it should be created with
- // based on |user_agent_override_option|.
- DCHECK_NE(UserAgentType::DESKTOP, pending_item->GetUserAgentType());
- if (pending_item->GetUserAgentType() == UserAgentType::NONE)
- return;
-
- switch (user_agent_override_option) {
- case UserAgentOverrideOption::DESKTOP:
- pending_item->SetUserAgentType(UserAgentType::DESKTOP);
- break;
- case UserAgentOverrideOption::MOBILE:
- pending_item->SetUserAgentType(UserAgentType::MOBILE);
- break;
- case UserAgentOverrideOption::INHERIT: {
- // Propagate the last committed non-native item's UserAgentType if there
- // is one, otherwise keep the default value, which is mobile.
- NavigationItem* last_non_native_item =
- GetLastCommittedNonAppSpecificItem();
- DCHECK(!last_non_native_item ||
- last_non_native_item->GetUserAgentType() != UserAgentType::NONE);
- if (last_non_native_item) {
- pending_item->SetUserAgentType(
- last_non_native_item->GetUserAgentType());
- }
- break;
- }
- }
-}
-
-void NavigationManagerImpl::CommitPendingItem() {
- [session_controller_ commitPendingItem];
-}
-
-BrowserState* NavigationManagerImpl::GetBrowserState() const {
- return browser_state_;
-}
-
-WebState* NavigationManagerImpl::GetWebState() const {
- return delegate_->GetWebState();
-}
-
-NavigationItem* NavigationManagerImpl::GetVisibleItem() const {
- return [session_controller_ visibleItem];
-}
-
-NavigationItem* NavigationManagerImpl::GetLastCommittedItem() const {
- return [session_controller_ lastCommittedItem];
-}
-
-NavigationItem* NavigationManagerImpl::GetPendingItem() const {
- return [session_controller_ pendingItem];
-}
-
-NavigationItem* NavigationManagerImpl::GetTransientItem() const {
- return [session_controller_ transientItem];
-}
-
-void NavigationManagerImpl::DiscardNonCommittedItems() {
- [session_controller_ discardNonCommittedItems];
-}
-
-void NavigationManagerImpl::LoadURLWithParams(
- const NavigationManager::WebLoadParams& params) {
- delegate_->LoadURLWithParams(params);
-}
-
-void NavigationManagerImpl::AddTransientURLRewriter(
- BrowserURLRewriter::URLRewriter rewriter) {
- DCHECK(rewriter);
- if (!transient_url_rewriters_) {
- transient_url_rewriters_.reset(
- new std::vector<BrowserURLRewriter::URLRewriter>());
- }
- transient_url_rewriters_->push_back(rewriter);
-}
-
-int NavigationManagerImpl::GetItemCount() const {
- return [session_controller_ items].size();
-}
-
-NavigationItem* NavigationManagerImpl::GetItemAtIndex(size_t index) const {
- return [session_controller_ itemAtIndex:index];
-}
-
-int NavigationManagerImpl::GetIndexOfItem(
- const web::NavigationItem* item) const {
- return [session_controller_ indexOfItem:item];
-}
-
-int NavigationManagerImpl::GetPendingItemIndex() const {
- if (GetPendingItem()) {
- if ([session_controller_ pendingItemIndex] != -1) {
- return [session_controller_ pendingItemIndex];
- }
- // TODO(crbug.com/665189): understand why last committed item index is
- // returned here.
- return GetLastCommittedItemIndex();
- }
- return -1;
-}
-
-int NavigationManagerImpl::GetLastCommittedItemIndex() const {
- if (GetItemCount() == 0)
- return -1;
- return [session_controller_ lastCommittedItemIndex];
-}
-
-bool NavigationManagerImpl::RemoveItemAtIndex(int index) {
- if (index == GetLastCommittedItemIndex() || index == GetPendingItemIndex())
- return false;
-
- if (index < 0 || index >= GetItemCount())
- return false;
-
- [session_controller_ removeItemAtIndex:index];
- return true;
-}
-
-bool NavigationManagerImpl::CanGoBack() const {
- return CanGoToOffset(-1);
-}
-
-bool NavigationManagerImpl::CanGoForward() const {
- return CanGoToOffset(1);
-}
-
-bool NavigationManagerImpl::CanGoToOffset(int offset) const {
- int index = GetIndexForOffset(offset);
- return 0 <= index && index < GetItemCount();
-}
-
-void NavigationManagerImpl::GoBack() {
- delegate_->GoToIndex(GetIndexForOffset(-1));
-}
-
-void NavigationManagerImpl::GoForward() {
- delegate_->GoToIndex(GetIndexForOffset(1));
-}
-
-void NavigationManagerImpl::GoToIndex(int index) {
- delegate_->GoToIndex(index);
-}
-
-NavigationItemList NavigationManagerImpl::GetBackwardItems() const {
- return [session_controller_ backwardItems];
-}
-
-NavigationItemList NavigationManagerImpl::GetForwardItems() const {
- return [session_controller_ forwardItems];
-}
-
-void NavigationManagerImpl::Reload(ReloadType reload_type,
- bool check_for_reposts) {
- if (!GetTransientItem() && !GetPendingItem() && !GetLastCommittedItem())
- return;
-
- // Reload with ORIGINAL_REQUEST_URL type should reload with the original
- // request url of the transient item, or pending item if transient doesn't
- // exist, or last committed item if both of them don't exist. The reason is
- // that a server side redirect may change the item's url.
- // For example, the user visits www.chromium.org and is then redirected
- // to m.chromium.org, when the user wants to refresh the page with a different
- // configuration (e.g. user agent), the user would be expecting to visit
- // www.chromium.org instead of m.chromium.org.
- if (reload_type == web::ReloadType::ORIGINAL_REQUEST_URL) {
- NavigationItem* reload_item = nullptr;
- if (GetTransientItem())
- reload_item = GetTransientItem();
- else if (GetPendingItem())
- reload_item = GetPendingItem();
- else
- reload_item = GetLastCommittedItem();
- DCHECK(reload_item);
-
- reload_item->SetURL(reload_item->GetOriginalRequestURL());
- }
-
- delegate_->Reload();
-}
-
-void NavigationManagerImpl::CopyStateFromAndPrune(
- const NavigationManager* manager) {
- DCHECK(manager);
- CRWSessionController* other_session =
- static_cast<const NavigationManagerImpl*>(manager)->session_controller_;
- [session_controller_ copyStateFromSessionControllerAndPrune:other_session];
-}
-
-bool NavigationManagerImpl::CanPruneAllButLastCommittedItem() const {
- return [session_controller_ canPruneAllButLastCommittedItem];
-}
-
-std::unique_ptr<std::vector<BrowserURLRewriter::URLRewriter>>
-NavigationManagerImpl::GetTransientURLRewriters() {
- return std::move(transient_url_rewriters_);
-}
-
-void NavigationManagerImpl::RemoveTransientURLRewriters() {
- transient_url_rewriters_.reset();
-}
-
-int NavigationManagerImpl::GetIndexForOffset(int offset) const {
- int result = [session_controller_ pendingItemIndex] == -1
- ? GetLastCommittedItemIndex()
- : static_cast<int>([session_controller_ pendingItemIndex]);
-
- if (offset < 0) {
- if (GetTransientItem() && [session_controller_ pendingItemIndex] == -1) {
- // Going back from transient item that added to the end navigation stack
- // is a matter of discarding it as there is no need to move navigation
- // index back.
- offset++;
- }
-
- while (offset < 0 && result > 0) {
- // To stop the user getting 'stuck' on redirecting pages they weren't
- // even aware existed, it is necessary to pass over pages that would
- // immediately result in a redirect (the item *before* the redirected
- // page).
- while (result > 0 && IsRedirectItemAtIndex(result)) {
- --result;
- }
- --result;
- ++offset;
- }
- // Result may be out of bounds, so stop trying to skip redirect items and
- // simply add the remainder.
- result += offset;
- if (result > GetItemCount() /* overflow */)
- result = INT_MIN;
- } else if (offset > 0) {
- while (offset > 0 && result < GetItemCount()) {
- ++result;
- --offset;
- // As with going back, skip over redirects.
- while (result + 1 < GetItemCount() && IsRedirectItemAtIndex(result + 1)) {
- ++result;
- }
- }
- // Result may be out of bounds, so stop trying to skip redirect items and
- // simply add the remainder.
- result += offset;
- if (result < 0 /* overflow */)
- result = INT_MAX;
- }
-
- return result;
-}
-
-bool NavigationManagerImpl::IsRedirectItemAtIndex(int index) const {
- DCHECK_GE(index, 0);
- DCHECK_LT(index, GetItemCount());
- ui::PageTransition transition = GetItemAtIndex(index)->GetTransitionType();
- return transition & ui::PAGE_TRANSITION_IS_REDIRECT_MASK;
-}
-
-NavigationItem* NavigationManagerImpl::GetLastCommittedNonAppSpecificItem()
- const {
- int index = GetLastCommittedItemIndex();
- if (index == -1)
- return nullptr;
- WebClient* client = GetWebClient();
- const ScopedNavigationItemImplList& items = [session_controller_ items];
- while (index >= 0) {
- NavigationItem* item = items[index--].get();
- if (!client->IsAppSpecificURL(item->GetVirtualURL()))
- return item;
- }
- return nullptr;
-}
-
-} // namespace web
« no previous file with comments | « ios/web/navigation/navigation_manager_impl.h ('k') | ios/web/navigation/navigation_manager_impl_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698