| Index: chrome/browser/ui/tabs/tab_finder.cc
|
| diff --git a/chrome/browser/ui/tabs/tab_finder.cc b/chrome/browser/ui/tabs/tab_finder.cc
|
| deleted file mode 100644
|
| index cca41b5d7568595a1cba72f82aeb690412496b39..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/tabs/tab_finder.cc
|
| +++ /dev/null
|
| @@ -1,246 +0,0 @@
|
| -// Copyright (c) 2012 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.
|
| -
|
| -#include "chrome/browser/ui/tabs/tab_finder.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/bind_helpers.h"
|
| -#include "base/command_line.h"
|
| -#include "base/stl_util.h"
|
| -#include "chrome/browser/history/history.h"
|
| -#include "chrome/browser/history/history_service_factory.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/browser_list.h"
|
| -#include "chrome/browser/ui/tab_contents/tab_contents.h"
|
| -#include "chrome/common/chrome_notification_types.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| -#include "content/public/browser/navigation_details.h"
|
| -#include "content/public/browser/navigation_entry.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -#include "content/public/browser/notification_source.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "content/public/browser/web_contents_observer.h"
|
| -#include "content/public/common/frame_navigate_params.h"
|
| -#include "content/public/common/page_transition_types.h"
|
| -
|
| -using content::NavigationEntry;
|
| -using content::WebContents;
|
| -
|
| -class TabFinder::WebContentsObserverImpl : public content::WebContentsObserver {
|
| - public:
|
| - WebContentsObserverImpl(WebContents* tab, TabFinder* finder);
|
| - virtual ~WebContentsObserverImpl();
|
| -
|
| - WebContents* web_contents() {
|
| - return content::WebContentsObserver::web_contents();
|
| - }
|
| -
|
| - // content::WebContentsObserver overrides:
|
| - virtual void DidNavigateAnyFrame(
|
| - const content::LoadCommittedDetails& details,
|
| - const content::FrameNavigateParams& params) OVERRIDE;
|
| - virtual void WebContentsDestroyed(WebContents* tab) OVERRIDE;
|
| -
|
| - private:
|
| - TabFinder* finder_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(WebContentsObserverImpl);
|
| -};
|
| -
|
| -TabFinder::WebContentsObserverImpl::WebContentsObserverImpl(
|
| - WebContents* tab,
|
| - TabFinder* finder)
|
| - : content::WebContentsObserver(tab),
|
| - finder_(finder) {
|
| -}
|
| -
|
| -TabFinder::WebContentsObserverImpl::~WebContentsObserverImpl() {
|
| -}
|
| -
|
| -void TabFinder::WebContentsObserverImpl::DidNavigateAnyFrame(
|
| - const content::LoadCommittedDetails& details,
|
| - const content::FrameNavigateParams& params) {
|
| - finder_->DidNavigateAnyFrame(web_contents(), details, params);
|
| -}
|
| -
|
| -void TabFinder::WebContentsObserverImpl::WebContentsDestroyed(
|
| - WebContents* tab) {
|
| - finder_->TabDestroyed(this);
|
| - delete this;
|
| -}
|
| -
|
| -// static
|
| -TabFinder* TabFinder::GetInstance() {
|
| - return IsEnabled() ? Singleton<TabFinder>::get() : NULL;
|
| -}
|
| -
|
| -// static
|
| -bool TabFinder::IsEnabled() {
|
| - return CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kFocusExistingTabOnOpen);
|
| -}
|
| -
|
| -WebContents* TabFinder::FindTab(Browser* browser,
|
| - const GURL& url,
|
| - Browser** existing_browser) {
|
| - if (browser->profile()->IsOffTheRecord())
|
| - return NULL;
|
| -
|
| - // If the current tab matches the url, ignore it and let the user reload the
|
| - // existing tab.
|
| - WebContents* selected_tab = browser->GetActiveWebContents();
|
| - if (TabMatchesURL(selected_tab, url))
|
| - return NULL;
|
| -
|
| - // See if the current browser has a tab matching the specified url.
|
| - WebContents* tab_in_browser = FindTabInBrowser(browser, url);
|
| - if (tab_in_browser) {
|
| - *existing_browser = browser;
|
| - return tab_in_browser;
|
| - }
|
| -
|
| - // Then check other browsers.
|
| - for (BrowserList::const_iterator i = BrowserList::begin();
|
| - i != BrowserList::end(); ++i) {
|
| - if (!(*i)->profile()->IsOffTheRecord() &&
|
| - (*i)->profile()->IsSameProfile(browser->profile())) {
|
| - tab_in_browser = FindTabInBrowser(*i, url);
|
| - if (tab_in_browser) {
|
| - *existing_browser = *i;
|
| - return tab_in_browser;
|
| - }
|
| - }
|
| - }
|
| -
|
| - return NULL;
|
| -}
|
| -
|
| -void TabFinder::Observe(int type,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - DCHECK_EQ(type, chrome::NOTIFICATION_TAB_PARENTED);
|
| -
|
| - // The tab was added to a browser. Query for its state now.
|
| - TabContents* tab = content::Source<TabContents>(source).ptr();
|
| - TrackTab(tab->web_contents());
|
| -}
|
| -
|
| -TabFinder::TabFinder() {
|
| - registrar_.Add(this, chrome::NOTIFICATION_TAB_PARENTED,
|
| - content::NotificationService::AllSources());
|
| -}
|
| -
|
| -TabFinder::~TabFinder() {
|
| - STLDeleteElements(&tab_contents_observers_);
|
| -}
|
| -
|
| -void TabFinder::DidNavigateAnyFrame(
|
| - WebContents* source,
|
| - const content::LoadCommittedDetails& details,
|
| - const content::FrameNavigateParams& params) {
|
| - CancelRequestsFor(source);
|
| -
|
| - if (content::PageTransitionIsRedirect(params.transition)) {
|
| - // If this is a redirect, we need to go to the db to get the start.
|
| - FetchRedirectStart(source);
|
| - } else if (params.redirects.size() > 1 ||
|
| - params.redirects[0] != details.entry->GetURL()) {
|
| - web_contents_to_url_[source] = params.redirects[0];
|
| - }
|
| -}
|
| -
|
| -bool TabFinder::TabMatchesURL(WebContents* tab_contents, const GURL& url) {
|
| - if (tab_contents->GetURL() == url)
|
| - return true;
|
| -
|
| - WebContentsToURLMap::const_iterator i =
|
| - web_contents_to_url_.find(tab_contents);
|
| - return i != web_contents_to_url_.end() && i->second == url;
|
| -}
|
| -
|
| -WebContents* TabFinder::FindTabInBrowser(Browser* browser, const GURL& url) {
|
| - if (!browser->is_type_tabbed())
|
| - return NULL;
|
| -
|
| - for (int i = 0; i < browser->tab_count(); ++i) {
|
| - if (TabMatchesURL(browser->GetWebContentsAt(i), url))
|
| - return browser->GetWebContentsAt(i);
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -void TabFinder::TrackTab(WebContents* tab) {
|
| - for (WebContentsObservers::const_iterator i = tab_contents_observers_.begin();
|
| - i != tab_contents_observers_.end(); ++i) {
|
| - if ((*i)->web_contents() == tab) {
|
| - // Already tracking the tab.
|
| - return;
|
| - }
|
| - }
|
| - WebContentsObserverImpl* observer = new WebContentsObserverImpl(tab, this);
|
| - tab_contents_observers_.insert(observer);
|
| - FetchRedirectStart(tab);
|
| -}
|
| -
|
| -void TabFinder::TabDestroyed(WebContentsObserverImpl* observer) {
|
| - DCHECK_GT(tab_contents_observers_.count(observer), 0u);
|
| - tab_contents_observers_.erase(observer);
|
| -}
|
| -
|
| -void TabFinder::CancelRequestsFor(WebContents* web_contents) {
|
| - Profile* profile =
|
| - Profile::FromBrowserContext(web_contents->GetBrowserContext());
|
| - if (profile->IsOffTheRecord())
|
| - return;
|
| -
|
| - web_contents_to_url_.erase(web_contents);
|
| -
|
| - HistoryService* history =
|
| - HistoryServiceFactory::GetForProfile(profile,
|
| - Profile::EXPLICIT_ACCESS);
|
| - if (history) {
|
| - CancelableRequestProvider::Handle request_handle;
|
| - if (callback_consumer_.GetFirstHandleForClientData(web_contents,
|
| - &request_handle)) {
|
| - history->CancelRequest(request_handle);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void TabFinder::FetchRedirectStart(WebContents* tab) {
|
| - Profile* profile = Profile::FromBrowserContext(tab->GetBrowserContext());
|
| - if (profile->IsOffTheRecord())
|
| - return;
|
| -
|
| - NavigationEntry* committed_entry =
|
| - tab->GetController().GetLastCommittedEntry();
|
| - if (!committed_entry || committed_entry->GetURL().is_empty())
|
| - return;
|
| -
|
| - HistoryService* history =
|
| - HistoryServiceFactory::GetForProfile(profile,
|
| - Profile::EXPLICIT_ACCESS);
|
| - if (history) {
|
| - CancelableRequestProvider::Handle request_handle =
|
| - history->QueryRedirectsTo(
|
| - committed_entry->GetURL(),
|
| - &callback_consumer_,
|
| - base::Bind(&TabFinder::QueryRedirectsToComplete,
|
| - base::Unretained(this)));
|
| - callback_consumer_.SetClientData(history, request_handle, tab);
|
| - }
|
| -}
|
| -
|
| -void TabFinder::QueryRedirectsToComplete(HistoryService::Handle handle,
|
| - GURL url,
|
| - bool success,
|
| - history::RedirectList* redirects) {
|
| - if (success && !redirects->empty()) {
|
| - WebContents* web_contents =
|
| - callback_consumer_.GetClientDataForCurrentRequest();
|
| - DCHECK(web_contents);
|
| - web_contents_to_url_[web_contents] = redirects->back();
|
| - }
|
| -}
|
|
|