OLD | NEW |
| (Empty) |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/ui/apps/chrome_shell_window_delegate.h" | |
6 | |
7 #include "base/strings/stringprintf.h" | |
8 #include "chrome/browser/favicon/favicon_tab_helper.h" | |
9 #include "chrome/browser/file_select_helper.h" | |
10 #include "chrome/browser/media/media_capture_devices_dispatcher.h" | |
11 #include "chrome/browser/platform_util.h" | |
12 #include "chrome/browser/profiles/profile.h" | |
13 #include "chrome/browser/shell_integration.h" | |
14 #include "chrome/browser/ui/browser.h" | |
15 #include "chrome/browser/ui/browser_dialogs.h" | |
16 #include "chrome/browser/ui/browser_tabstrip.h" | |
17 #include "chrome/browser/ui/browser_window.h" | |
18 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" | |
19 #include "chrome/common/render_messages.h" | |
20 #include "content/public/browser/browser_context.h" | |
21 #include "content/public/browser/render_view_host.h" | |
22 #include "content/public/browser/web_contents.h" | |
23 #include "content/public/browser/web_contents_view.h" | |
24 | |
25 #if defined(USE_ASH) | |
26 #include "ash/shelf/shelf_constants.h" | |
27 #endif | |
28 | |
29 #if defined(ENABLE_PRINTING) | |
30 #if defined(ENABLE_FULL_PRINTING) | |
31 #include "chrome/browser/printing/print_preview_message_handler.h" | |
32 #include "chrome/browser/printing/print_view_manager.h" | |
33 #else | |
34 #include "chrome/browser/printing/print_view_manager_basic.h" | |
35 #endif // defined(ENABLE_FULL_PRINTING) | |
36 #endif // defined(ENABLE_PRINTING) | |
37 | |
38 namespace { | |
39 | |
40 bool disable_external_open_for_testing_ = false; | |
41 | |
42 // Opens a URL with Chromium (not external browser) with the right profile. | |
43 content::WebContents* OpenURLFromTabInternal( | |
44 content::BrowserContext* context, | |
45 content::WebContents* source, | |
46 const content::OpenURLParams& params) { | |
47 // Force all links to open in a new tab, even if they were trying to open a | |
48 // window. | |
49 chrome::NavigateParams new_tab_params( | |
50 static_cast<Browser*>(NULL), params.url, params.transition); | |
51 new_tab_params.disposition = params.disposition == NEW_BACKGROUND_TAB | |
52 ? params.disposition | |
53 : NEW_FOREGROUND_TAB; | |
54 new_tab_params.initiating_profile = Profile::FromBrowserContext(context); | |
55 chrome::Navigate(&new_tab_params); | |
56 | |
57 return new_tab_params.target_contents; | |
58 } | |
59 | |
60 // Helper class that opens a URL based on if this browser instance is the | |
61 // default system browser. If it is the default, open the URL directly instead | |
62 // of asking the system to open it. | |
63 class OpenURLFromTabBasedOnBrowserDefault | |
64 : public ShellIntegration::DefaultWebClientObserver { | |
65 public: | |
66 OpenURLFromTabBasedOnBrowserDefault(content::WebContents* source, | |
67 const content::OpenURLParams& params) | |
68 : source_(source), params_(params) {} | |
69 | |
70 // Opens a URL when called with the result of if this is the default system | |
71 // browser or not. | |
72 virtual void SetDefaultWebClientUIState( | |
73 ShellIntegration::DefaultWebClientUIState state) OVERRIDE { | |
74 Profile* profile = | |
75 Profile::FromBrowserContext(source_->GetBrowserContext()); | |
76 DCHECK(profile); | |
77 if (!profile) | |
78 return; | |
79 switch (state) { | |
80 case ShellIntegration::STATE_PROCESSING: | |
81 break; | |
82 case ShellIntegration::STATE_IS_DEFAULT: | |
83 OpenURLFromTabInternal(profile, source_, params_); | |
84 break; | |
85 case ShellIntegration::STATE_NOT_DEFAULT: | |
86 case ShellIntegration::STATE_UNKNOWN: | |
87 platform_util::OpenExternal(profile, params_.url); | |
88 break; | |
89 } | |
90 } | |
91 | |
92 virtual bool IsOwnedByWorker() OVERRIDE { return true; } | |
93 | |
94 private: | |
95 content::WebContents* source_; | |
96 const content::OpenURLParams params_; | |
97 }; | |
98 | |
99 } // namespace | |
100 | |
101 ShellWindowLinkDelegate::ShellWindowLinkDelegate() {} | |
102 | |
103 ShellWindowLinkDelegate::~ShellWindowLinkDelegate() {} | |
104 | |
105 // TODO(rockot): Add a test that exercises this code. See | |
106 // http://crbug.com/254260. | |
107 content::WebContents* ShellWindowLinkDelegate::OpenURLFromTab( | |
108 content::WebContents* source, | |
109 const content::OpenURLParams& params) { | |
110 if (source) { | |
111 scoped_refptr<ShellIntegration::DefaultWebClientWorker> | |
112 check_if_default_browser_worker = | |
113 new ShellIntegration::DefaultBrowserWorker( | |
114 new OpenURLFromTabBasedOnBrowserDefault(source, params)); | |
115 // Object lifetime notes: The OpenURLFromTabBasedOnBrowserDefault is owned | |
116 // by check_if_default_browser_worker. StartCheckIsDefault() takes lifetime | |
117 // ownership of check_if_default_browser_worker and will clean up after | |
118 // the asynchronous tasks. | |
119 check_if_default_browser_worker->StartCheckIsDefault(); | |
120 } | |
121 return NULL; | |
122 } | |
123 | |
124 ChromeShellWindowDelegate::ChromeShellWindowDelegate() {} | |
125 | |
126 ChromeShellWindowDelegate::~ChromeShellWindowDelegate() {} | |
127 | |
128 void ChromeShellWindowDelegate::DisableExternalOpenForTesting() { | |
129 disable_external_open_for_testing_ = true; | |
130 } | |
131 | |
132 void ChromeShellWindowDelegate::InitWebContents( | |
133 content::WebContents* web_contents) { | |
134 FaviconTabHelper::CreateForWebContents(web_contents); | |
135 | |
136 #if defined(ENABLE_PRINTING) | |
137 #if defined(ENABLE_FULL_PRINTING) | |
138 printing::PrintViewManager::CreateForWebContents(web_contents); | |
139 printing::PrintPreviewMessageHandler::CreateForWebContents(web_contents); | |
140 #else | |
141 printing::PrintViewManagerBasic::CreateForWebContents(web_contents); | |
142 #endif // defined(ENABLE_FULL_PRINTING) | |
143 #endif // defined(ENABLE_PRINTING) | |
144 } | |
145 | |
146 apps::NativeAppWindow* ChromeShellWindowDelegate::CreateNativeAppWindow( | |
147 apps::AppWindow* window, | |
148 const apps::AppWindow::CreateParams& params) { | |
149 return CreateNativeAppWindowImpl(window, params); | |
150 } | |
151 | |
152 content::WebContents* ChromeShellWindowDelegate::OpenURLFromTab( | |
153 content::BrowserContext* context, | |
154 content::WebContents* source, | |
155 const content::OpenURLParams& params) { | |
156 return OpenURLFromTabInternal(context, source, params); | |
157 } | |
158 | |
159 void ChromeShellWindowDelegate::AddNewContents( | |
160 content::BrowserContext* context, | |
161 content::WebContents* new_contents, | |
162 WindowOpenDisposition disposition, | |
163 const gfx::Rect& initial_pos, | |
164 bool user_gesture, | |
165 bool* was_blocked) { | |
166 if (!disable_external_open_for_testing_) { | |
167 if (!shell_window_link_delegate_.get()) | |
168 shell_window_link_delegate_.reset(new ShellWindowLinkDelegate()); | |
169 new_contents->SetDelegate(shell_window_link_delegate_.get()); | |
170 return; | |
171 } | |
172 chrome::ScopedTabbedBrowserDisplayer displayer( | |
173 Profile::FromBrowserContext(context), chrome::GetActiveDesktop()); | |
174 // Force all links to open in a new tab, even if they were trying to open a | |
175 // new window. | |
176 disposition = | |
177 disposition == NEW_BACKGROUND_TAB ? disposition : NEW_FOREGROUND_TAB; | |
178 chrome::AddWebContents(displayer.browser(), NULL, new_contents, disposition, | |
179 initial_pos, user_gesture, was_blocked); | |
180 } | |
181 | |
182 content::ColorChooser* ChromeShellWindowDelegate::ShowColorChooser( | |
183 content::WebContents* web_contents, | |
184 SkColor initial_color) { | |
185 return chrome::ShowColorChooser(web_contents, initial_color); | |
186 } | |
187 | |
188 void ChromeShellWindowDelegate::RunFileChooser( | |
189 content::WebContents* tab, | |
190 const content::FileChooserParams& params) { | |
191 FileSelectHelper::RunFileChooser(tab, params); | |
192 } | |
193 | |
194 void ChromeShellWindowDelegate::RequestMediaAccessPermission( | |
195 content::WebContents* web_contents, | |
196 const content::MediaStreamRequest& request, | |
197 const content::MediaResponseCallback& callback, | |
198 const extensions::Extension* extension) { | |
199 MediaCaptureDevicesDispatcher::GetInstance()->ProcessMediaAccessRequest( | |
200 web_contents, request, callback, extension); | |
201 } | |
202 | |
203 int ChromeShellWindowDelegate::PreferredIconSize() { | |
204 #if defined(USE_ASH) | |
205 return ash::kShelfPreferredSize; | |
206 #else | |
207 return extension_misc::EXTENSION_ICON_SMALL; | |
208 #endif | |
209 } | |
210 | |
211 void ChromeShellWindowDelegate::SetWebContentsBlocked( | |
212 content::WebContents* web_contents, | |
213 bool blocked) { | |
214 // RenderViewHost may be NULL during shutdown. | |
215 content::RenderViewHost* host = web_contents->GetRenderViewHost(); | |
216 if (host) { | |
217 host->Send(new ChromeViewMsg_SetVisuallyDeemphasized( | |
218 host->GetRoutingID(), blocked)); | |
219 } | |
220 } | |
221 | |
222 bool ChromeShellWindowDelegate::IsWebContentsVisible( | |
223 content::WebContents* web_contents) { | |
224 return platform_util::IsVisible(web_contents->GetView()->GetNativeView()); | |
225 } | |
OLD | NEW |