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