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 |