chrome_web_contents_handler.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
10511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// Copyright (c) 2012 The Chromium Authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 40511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 50511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com#include "chrome/browser/ui/webui/chrome_web_contents_handler.h" 6196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 70511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com#include "chrome/browser/profiles/profile.h" 85de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "chrome/browser/ui/browser.h" 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "chrome/browser/ui/browser_finder.h" 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "chrome/browser/ui/browser_navigator.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "chrome/browser/ui/browser_window.h" 124b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "chrome/browser/ui/host_desktop.h" 134b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "chrome/browser/ui/tabs/tab_strip_model.h" 14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "content/public/browser/web_contents.h" 15196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgusing content::BrowserContext; 17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgusing content::OpenURLParams; 180511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comusing content::WebContents; 190511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 200511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comChromeWebContentsHandler::ChromeWebContentsHandler() { 210511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com} 224f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 234f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgChromeWebContentsHandler::~ChromeWebContentsHandler() { 244f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org} 254f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 264f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org// Opens a new URL inside |source|. |context| is the browser context that the 274f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org// browser should be owned by. |params| contains the URL to open and various 284f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org// attributes such as disposition. On return |out_new_contents| contains the 294f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org// WebContents the URL is opened in. Returns the web contents opened by the 300511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// browser. 314f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgWebContents* ChromeWebContentsHandler::OpenURLFromTab( 324f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org content::BrowserContext* context, 334f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org WebContents* source, 344f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org const OpenURLParams& params) { 350511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com if (!context) 360511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com return NULL; 370511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 384f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org Profile* profile = Profile::FromBrowserContext(context); 394f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 400511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com chrome::HostDesktopType desktop_type = chrome::HOST_DESKTOP_TYPE_NATIVE; 410511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com if (source) { 420511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com Browser* source_browser = chrome::FindBrowserWithWebContents(source); 430511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com if (source_browser) 440511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com desktop_type = source_browser->host_desktop_type(); 450511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com } 460511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 470511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com Browser* browser = chrome::FindTabbedBrowser(profile, false, desktop_type); 480511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com const bool browser_created = !browser; 490511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com if (!browser) 500511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com browser = new Browser( 510511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com Browser::CreateParams(Browser::TYPE_TABBED, profile, desktop_type)); 520511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com chrome::NavigateParams nav_params(browser, params.url, params.transition); 530511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com nav_params.referrer = params.referrer; 540511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com if (source && source->IsCrashed() && 550511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com params.disposition == CURRENT_TAB && 560511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com params.transition == content::PAGE_TRANSITION_LINK) { 570511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com nav_params.disposition = NEW_FOREGROUND_TAB; 580511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com } else { 590511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com nav_params.disposition = params.disposition; 600511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com } 610511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com nav_params.window_action = chrome::NavigateParams::SHOW_WINDOW; 620511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com nav_params.user_gesture = true; 630511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com chrome::Navigate(&nav_params); 640511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 650511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com // Close the browser if chrome::Navigate created a new one. 660511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com if (browser_created && (browser != nav_params.browser)) 670511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com browser->window()->Close(); 680511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 690511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com return nav_params.target_contents; 700511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com} 710511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 720511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// Creates a new tab with |new_contents|. |context| is the browser context that 730511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// the browser should be owned by. |source| is the WebContent where the 740511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// operation originated. |disposition| controls how the new tab should be 750511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// opened. |initial_pos| is the position of the window if a new window is 760511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// created. |user_gesture| is true if the operation was started by a user 770511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// gesture. 780511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comvoid ChromeWebContentsHandler::AddNewContents( 790511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com content::BrowserContext* context, 800511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com WebContents* source, 810511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com WebContents* new_contents, 820511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com WindowOpenDisposition disposition, 830511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com const gfx::Rect& initial_pos, 840511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com bool user_gesture) { 850511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com if (!context) 860511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com return; 870511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 880511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com Profile* profile = Profile::FromBrowserContext(context); 890511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 900511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com chrome::HostDesktopType desktop_type = chrome::HOST_DESKTOP_TYPE_NATIVE; 910511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com if (source) { 920511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com Browser* source_browser = chrome::FindBrowserWithWebContents(source); 930511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com if (source_browser) 940511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com desktop_type = source_browser->host_desktop_type(); 950511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com } 960511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 970511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com Browser* browser = chrome::FindTabbedBrowser(profile, false, desktop_type); 980511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com const bool browser_created = !browser; 990511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com if (!browser) 1000511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com browser = new Browser( 1010511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com Browser::CreateParams(Browser::TYPE_TABBED, profile, desktop_type)); 1020511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com chrome::NavigateParams params(browser, new_contents); 1030511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com params.source_contents = source; 1040511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com params.disposition = disposition; 1050511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com params.window_bounds = initial_pos; 1060511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com params.window_action = chrome::NavigateParams::SHOW_WINDOW; 1070511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com params.user_gesture = true; 1084f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org chrome::Navigate(¶ms); 1090511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 1100511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com // Close the browser if chrome::Navigate created a new one. 1110511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com if (browser_created && (browser != params.browser)) 1120511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com browser->window()->Close(); 1130511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com} 1140511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com