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(&params);
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