1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/apps/chrome_app_window_delegate.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/memory/scoped_ptr.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/stringprintf.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/favicon/favicon_tab_helper.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/file_select_helper.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/media/media_capture_devices_dispatcher.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/platform_util.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/shell_integration.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/browser.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/browser_dialogs.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/browser_tabstrip.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/browser_window.h"
190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/render_messages.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/browser_context.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/render_view_host.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/web_contents.h"
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/web_contents_delegate.h"
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/constants.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_ASH)
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/shelf/shelf_constants.h"
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
31c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_PRINTING)
32c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_FULL_PRINTING)
33c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/printing/print_preview_message_handler.h"
34c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/printing/print_view_manager.h"
35c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#else
36c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/printing/print_view_manager_basic.h"
37c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif  // defined(ENABLE_FULL_PRINTING)
38c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif  // defined(ENABLE_PRINTING)
39c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace {
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool disable_external_open_for_testing_ = false;
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Opens a URL with Chromium (not external browser) with the right profile.
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)content::WebContents* OpenURLFromTabInternal(
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::BrowserContext* context,
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const content::OpenURLParams& params) {
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Force all links to open in a new tab, even if they were trying to open a
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // window.
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chrome::NavigateParams new_tab_params(
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<Browser*>(NULL), params.url, params.transition);
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (params.disposition == NEW_BACKGROUND_TAB) {
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    new_tab_params.disposition = NEW_BACKGROUND_TAB;
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    new_tab_params.disposition = NEW_FOREGROUND_TAB;
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    new_tab_params.window_action = chrome::NavigateParams::SHOW_WINDOW;
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  new_tab_params.initiating_profile = Profile::FromBrowserContext(context);
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chrome::Navigate(&new_tab_params);
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return new_tab_params.target_contents;
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Helper class that opens a URL based on if this browser instance is the
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// default system browser. If it is the default, open the URL directly instead
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// of asking the system to open it.
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class OpenURLFromTabBasedOnBrowserDefault
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public ShellIntegration::DefaultWebClientObserver {
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OpenURLFromTabBasedOnBrowserDefault(scoped_ptr<content::WebContents> source,
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      const content::OpenURLParams& params)
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      : source_(source.Pass()), params_(params) {}
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Opens a URL when called with the result of if this is the default system
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // browser or not.
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetDefaultWebClientUIState(
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ShellIntegration::DefaultWebClientUIState state) OVERRIDE {
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Profile* profile =
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        Profile::FromBrowserContext(source_->GetBrowserContext());
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(profile);
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!profile)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (state) {
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ShellIntegration::STATE_PROCESSING:
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ShellIntegration::STATE_IS_DEFAULT:
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        OpenURLFromTabInternal(profile, params_);
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ShellIntegration::STATE_NOT_DEFAULT:
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ShellIntegration::STATE_UNKNOWN:
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        platform_util::OpenExternal(profile, params_.url);
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool IsOwnedByWorker() OVERRIDE { return true; }
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<content::WebContents> source_;
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const content::OpenURLParams params_;
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ChromeAppWindowDelegate::NewWindowContentsDelegate
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    : public content::WebContentsDelegate {
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  NewWindowContentsDelegate() {}
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~NewWindowContentsDelegate() {}
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual content::WebContents* OpenURLFromTab(
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      content::WebContents* source,
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const content::OpenURLParams& params) OVERRIDE;
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(NewWindowContentsDelegate);
118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochcontent::WebContents*
121effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochChromeAppWindowDelegate::NewWindowContentsDelegate::OpenURLFromTab(
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    content::WebContents* source,
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const content::OpenURLParams& params) {
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (source) {
125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // This NewWindowContentsDelegate was given ownership of the incoming
126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // WebContents by being assigned as its delegate within
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // ChromeAppWindowDelegate::AddNewContents, but this is the first time
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // NewWindowContentsDelegate actually sees the WebContents.
129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // Here it is captured for deletion.
130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    scoped_ptr<content::WebContents> owned_source(source);
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<ShellIntegration::DefaultWebClientWorker>
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        check_if_default_browser_worker =
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            new ShellIntegration::DefaultBrowserWorker(
134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                new OpenURLFromTabBasedOnBrowserDefault(owned_source.Pass(),
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                        params));
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Object lifetime notes: The OpenURLFromTabBasedOnBrowserDefault is owned
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // by check_if_default_browser_worker. StartCheckIsDefault() takes lifetime
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // ownership of check_if_default_browser_worker and will clean up after
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // the asynchronous tasks.
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    check_if_default_browser_worker->StartCheckIsDefault();
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return NULL;
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
145effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochChromeAppWindowDelegate::ChromeAppWindowDelegate()
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    : new_window_contents_delegate_(new NewWindowContentsDelegate()) {}
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ChromeAppWindowDelegate::~ChromeAppWindowDelegate() {}
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ChromeAppWindowDelegate::DisableExternalOpenForTesting() {
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  disable_external_open_for_testing_ = true;
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ChromeAppWindowDelegate::InitWebContents(
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    content::WebContents* web_contents) {
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FaviconTabHelper::CreateForWebContents(web_contents);
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(ENABLE_PRINTING)
159c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_FULL_PRINTING)
1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  printing::PrintViewManager::CreateForWebContents(web_contents);
161c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  printing::PrintPreviewMessageHandler::CreateForWebContents(web_contents);
162c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#else
163c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  printing::PrintViewManagerBasic::CreateForWebContents(web_contents);
164c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif  // defined(ENABLE_FULL_PRINTING)
165c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif  // defined(ENABLE_PRINTING)
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)apps::NativeAppWindow* ChromeAppWindowDelegate::CreateNativeAppWindow(
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    apps::AppWindow* window,
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const apps::AppWindow::CreateParams& params) {
1712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  return CreateNativeAppWindowImpl(window, params);
1722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
1732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)content::WebContents* ChromeAppWindowDelegate::OpenURLFromTab(
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::BrowserContext* context,
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    content::WebContents* source,
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const content::OpenURLParams& params) {
178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return OpenURLFromTabInternal(context, params);
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ChromeAppWindowDelegate::AddNewContents(content::BrowserContext* context,
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             content::WebContents* new_contents,
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             WindowOpenDisposition disposition,
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             const gfx::Rect& initial_pos,
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             bool user_gesture,
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             bool* was_blocked) {
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!disable_external_open_for_testing_) {
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // We don't really want to open a window for |new_contents|, but we need to
189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // capture its intended navigation. Here we give ownership to the
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // NewWindowContentsDelegate, which will dispose of the contents once
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // a navigation is captured.
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    new_contents->SetDelegate(new_window_contents_delegate_.get());
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  chrome::ScopedTabbedBrowserDisplayer displayer(
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Profile::FromBrowserContext(context), chrome::GetActiveDesktop());
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Force all links to open in a new tab, even if they were trying to open a
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // new window.
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  disposition =
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      disposition == NEW_BACKGROUND_TAB ? disposition : NEW_FOREGROUND_TAB;
2010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  chrome::AddWebContents(displayer.browser(), NULL, new_contents, disposition,
2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                         initial_pos, user_gesture, was_blocked);
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)content::ColorChooser* ChromeAppWindowDelegate::ShowColorChooser(
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    content::WebContents* web_contents,
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SkColor initial_color) {
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return chrome::ShowColorChooser(web_contents, initial_color);
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ChromeAppWindowDelegate::RunFileChooser(
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    content::WebContents* tab,
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const content::FileChooserParams& params) {
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FileSelectHelper::RunFileChooser(tab, params);
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ChromeAppWindowDelegate::RequestMediaAccessPermission(
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    content::WebContents* web_contents,
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const content::MediaStreamRequest& request,
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const content::MediaResponseCallback& callback,
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const extensions::Extension* extension) {
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest(
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      web_contents, request, callback, extension);
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int ChromeAppWindowDelegate::PreferredIconSize() {
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_ASH)
228a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return ash::kShelfSize;
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return extension_misc::EXTENSION_ICON_SMALL;
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ChromeAppWindowDelegate::SetWebContentsBlocked(
235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    content::WebContents* web_contents,
236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool blocked) {
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // RenderViewHost may be NULL during shutdown.
238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::RenderViewHost* host = web_contents->GetRenderViewHost();
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (host) {
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    host->Send(new ChromeViewMsg_SetVisuallyDeemphasized(
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host->GetRoutingID(), blocked));
242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool ChromeAppWindowDelegate::IsWebContentsVisible(
246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    content::WebContents* web_contents) {
247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return platform_util::IsVisible(web_contents->GetNativeView());
248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
249