blob: 2b43038c58c31a28768f9ecf8005c5ce64bbffc8 [file] [log] [blame]
[email protected]de7d61ff2013-08-20 11:30:411// Copyright 2013 The Chromium Authors. All rights reserved.
[email protected]9fbd3f862011-09-20 23:31:342// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]de7d61ff2013-08-20 11:30:415#include "content/shell/browser/shell.h"
[email protected]9fbd3f862011-09-20 23:31:346
avi66a07722015-12-25 23:38:127#include <stddef.h>
8
[email protected]11a65b692012-03-30 11:29:169#include "base/auto_reset.h"
[email protected]efb5f572012-01-29 10:57:3310#include "base/command_line.h"
skyostil95082a62015-06-05 19:53:0711#include "base/location.h"
avi66a07722015-12-25 23:38:1212#include "base/macros.h"
gabf64a25e2017-05-12 19:42:5613#include "base/message_loop/message_loop.h"
fdoray896bea12016-06-10 15:52:0114#include "base/run_loop.h"
skyostil95082a62015-06-05 19:53:0715#include "base/single_thread_task_runner.h"
[email protected]21aa99682013-06-11 07:17:0116#include "base/strings/string_number_conversions.h"
17#include "base/strings/string_util.h"
18#include "base/strings/stringprintf.h"
[email protected]74ebfb12013-06-07 20:48:0019#include "base/strings/utf_string_conversions.h"
gab30f26df2016-05-11 19:37:5520#include "base/threading/thread_task_runner_handle.h"
avi66a07722015-12-25 23:38:1221#include "build/build_config.h"
[email protected]b50452f2014-08-18 12:31:4422#include "content/public/browser/devtools_agent_host.h"
[email protected]0b659b32012-03-26 21:29:3223#include "content/public/browser/navigation_controller.h"
[email protected]b7c504c2013-05-07 14:42:1224#include "content/public/browser/navigation_entry.h"
[email protected]0b659b32012-03-26 21:29:3225#include "content/public/browser/render_view_host.h"
avif9ab5d942015-10-15 14:05:4426#include "content/public/browser/render_widget_host.h"
[email protected]0b659b32012-03-26 21:29:3227#include "content/public/browser/web_contents.h"
[email protected]7fff43e2013-05-21 20:21:1028#include "content/public/browser/web_contents_observer.h"
guoweis8efb6d892015-10-12 18:26:1729#include "content/public/common/content_switches.h"
[email protected]1596efb2013-01-17 22:13:0130#include "content/public/common/renderer_preferences.h"
guoweisc537ba22015-11-06 21:20:3131#include "content/public/common/webrtc_ip_handling_policy.h"
jochen5ce1af92016-02-17 20:39:4532#include "content/shell/browser/layout_test/blink_test_controller.h"
jyasskin8057c002015-09-10 19:09:5333#include "content/shell/browser/layout_test/layout_test_bluetooth_chooser_factory.h"
chenwilliamfed5bda2017-03-24 02:01:0634#include "content/shell/browser/layout_test/layout_test_devtools_bindings.h"
mkwst6efe7f2e62014-10-08 15:09:0135#include "content/shell/browser/layout_test/layout_test_javascript_dialog_manager.h"
lukasza8e550a02016-04-18 18:34:1736#include "content/shell/browser/layout_test/secondary_test_window_observer.h"
[email protected]de7d61ff2013-08-20 11:30:4137#include "content/shell/browser/shell_browser_main_parts.h"
38#include "content/shell/browser/shell_content_browser_client.h"
39#include "content/shell/browser/shell_devtools_frontend.h"
40#include "content/shell/browser/shell_javascript_dialog_manager.h"
carloskd9d97942017-02-16 08:58:0941#include "content/shell/common/layout_test/layout_test_switches.h"
[email protected]b7c504c2013-05-07 14:42:1242#include "content/shell/common/shell_messages.h"
43#include "content/shell/common/shell_switches.h"
Brett Wilson0748bf412016-11-22 17:55:4644#include "media/media_features.h"
[email protected]9fbd3f862011-09-20 23:31:3445
[email protected]9fbd3f862011-09-20 23:31:3446namespace content {
47
pdrcab84ee2015-03-13 21:47:0448const int kDefaultTestWindowWidthDip = 800;
49const int kDefaultTestWindowHeightDip = 600;
[email protected]1e57cab2013-05-28 04:26:1150
[email protected]e99ca5112011-09-26 17:22:5451std::vector<Shell*> Shell::windows_;
[email protected]9e00e6352012-07-30 17:05:1852base::Callback<void(Shell*)> Shell::shell_created_callback_;
[email protected]9fbd3f862011-09-20 23:31:3453
[email protected]11a65b692012-03-30 11:29:1654bool Shell::quit_message_loop_ = true;
55
[email protected]7fff43e2013-05-21 20:21:1056class Shell::DevToolsWebContentsObserver : public WebContentsObserver {
57 public:
58 DevToolsWebContentsObserver(Shell* shell, WebContents* web_contents)
59 : WebContentsObserver(web_contents),
60 shell_(shell) {
61 }
62
63 // WebContentsObserver
dchenge933b3e2014-10-21 11:44:0964 void WebContentsDestroyed() override {
[email protected]7fff43e2013-05-21 20:21:1065 shell_->OnDevToolsWebContentsDestroyed();
66 }
67
68 private:
69 Shell* shell_;
70
71 DISALLOW_COPY_AND_ASSIGN(DevToolsWebContentsObserver);
72};
73
[email protected]0b659b32012-03-26 21:29:3274Shell::Shell(WebContents* web_contents)
[email protected]1ef02d242013-10-07 16:18:5375 : WebContentsObserver(web_contents),
arthursonzognifdd49912017-08-31 08:55:2676 web_contents_(web_contents),
[email protected]1ef02d242013-10-07 16:18:5377 devtools_frontend_(NULL),
[email protected]001841c92012-12-11 17:00:1378 is_fullscreen_(false),
[email protected]99c014c2012-11-27 12:03:4279 window_(NULL),
sadrul8b11d262015-11-12 18:41:3380#if defined(OS_MACOSX)
[email protected]86b36e672012-12-21 00:09:5181 url_edit_view_(NULL),
sadrul8b11d262015-11-12 18:41:3382#endif
Pavel Feldmanc7cd063c2017-10-06 20:04:2883 headless_(false),
84 hide_toolbar_(false) {
arthursonzognifdd49912017-08-31 08:55:2685 web_contents_->SetDelegate(this);
86
lukasza381b0492016-03-10 16:48:4387 if (switches::IsRunLayoutTestSwitchPresent())
[email protected]86b36e672012-12-21 00:09:5188 headless_ = true;
Pavel Feldmanc7cd063c2017-10-06 20:04:2889
90 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
91 switches::kContentShellHideToolbar))
92 hide_toolbar_ = true;
93
[email protected]9e00e6352012-07-30 17:05:1894 windows_.push_back(this);
95
96 if (!shell_created_callback_.is_null()) {
97 shell_created_callback_.Run(this);
98 shell_created_callback_.Reset();
99 }
[email protected]9fbd3f862011-09-20 23:31:34100}
101
102Shell::~Shell() {
103 PlatformCleanUp();
[email protected]e99ca5112011-09-26 17:22:54104
105 for (size_t i = 0; i < windows_.size(); ++i) {
106 if (windows_[i] == this) {
107 windows_.erase(windows_.begin() + i);
108 break;
109 }
110 }
[email protected]11a65b692012-03-30 11:29:16111
[email protected]b53adf452014-02-07 12:55:08112 if (windows_.empty() && quit_message_loop_) {
113 if (headless_)
114 PlatformExit();
skyostil95082a62015-06-05 19:53:07115 base::ThreadTaskRunnerHandle::Get()->PostTask(
ki.stfu800779242015-10-12 22:46:26116 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
[email protected]b53adf452014-02-07 12:55:08117 }
arthursonzognifdd49912017-08-31 08:55:26118
119 web_contents_->SetDelegate(nullptr);
[email protected]9fbd3f862011-09-20 23:31:34120}
121
[email protected]c0d036d2013-05-07 12:50:50122Shell* Shell::CreateShell(WebContents* web_contents,
123 const gfx::Size& initial_size) {
[email protected]0b659b32012-03-26 21:29:32124 Shell* shell = new Shell(web_contents);
[email protected]c0d036d2013-05-07 12:50:50125 shell->PlatformCreateWindow(initial_size.width(), initial_size.height());
[email protected]3fd84032012-01-12 18:20:17126
[email protected]5cba3bf2012-01-14 02:40:35127 shell->PlatformSetContents();
[email protected]3fd84032012-01-12 18:20:17128
129 shell->PlatformResizeSubViews();
[email protected]1596efb2013-01-17 22:13:01130
creisb6561df2016-02-11 20:20:54131 // Note: Do not make RenderFrameHost or RenderViewHost specific state changes
132 // here, because they will be forgotten after a cross-process navigation. Use
133 // RenderFrameCreated or RenderViewCreated instead.
lukasza381b0492016-03-10 16:48:43134 if (switches::IsRunLayoutTestSwitchPresent()) {
[email protected]1596efb2013-01-17 22:13:01135 web_contents->GetMutableRendererPrefs()->use_custom_colors = false;
136 web_contents->GetRenderViewHost()->SyncRendererPrefs();
137 }
138
Brett Wilson0748bf412016-11-22 17:55:46139#if BUILDFLAG(ENABLE_WEBRTC)
lukasza381b0492016-03-10 16:48:43140 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
guoweis4ee48592015-12-02 06:37:07141 if (command_line->HasSwitch(switches::kForceWebRtcIPHandlingPolicy)) {
guoweisc537ba22015-11-06 21:20:31142 web_contents->GetMutableRendererPrefs()->webrtc_ip_handling_policy =
guoweis4ee48592015-12-02 06:37:07143 command_line->GetSwitchValueASCII(
144 switches::kForceWebRtcIPHandlingPolicy);
guoweis8efb6d892015-10-12 18:26:17145 }
146#endif
147
[email protected]3fd84032012-01-12 18:20:17148 return shell;
149}
150
[email protected]11a65b692012-03-30 11:29:16151void Shell::CloseAllWindows() {
[email protected]997ec9f2012-11-21 04:44:14152 base::AutoReset<bool> auto_reset(&quit_message_loop_, false);
[email protected]b50452f2014-08-18 12:31:44153 DevToolsAgentHost::DetachAllClients();
[email protected]11a65b692012-03-30 11:29:16154 std::vector<Shell*> open_windows(windows_);
155 for (size_t i = 0; i < open_windows.size(); ++i)
156 open_windows[i]->Close();
fdoray896bea12016-06-10 15:52:01157 base::RunLoop().RunUntilIdle();
dmazzoni948fbc72015-05-17 07:57:33158 PlatformExit();
[email protected]11a65b692012-03-30 11:29:16159}
160
[email protected]9e00e6352012-07-30 17:05:18161void Shell::SetShellCreatedCallback(
162 base::Callback<void(Shell*)> shell_created_callback) {
163 DCHECK(shell_created_callback_.is_null());
164 shell_created_callback_ = shell_created_callback;
165}
166
[email protected]74830f02012-01-30 22:27:04167Shell* Shell::FromRenderViewHost(RenderViewHost* rvh) {
168 for (size_t i = 0; i < windows_.size(); ++i) {
[email protected]0b659b32012-03-26 21:29:32169 if (windows_[i]->web_contents() &&
170 windows_[i]->web_contents()->GetRenderViewHost() == rvh) {
[email protected]74830f02012-01-30 22:27:04171 return windows_[i];
172 }
173 }
174 return NULL;
175}
176
[email protected]6153b272013-01-25 22:29:23177// static
178void Shell::Initialize() {
pdrcab84ee2015-03-13 21:47:04179 PlatformInitialize(GetShellDefaultSize());
[email protected]6153b272013-01-25 22:29:23180}
181
[email protected]a2904092013-10-15 04:53:59182gfx::Size Shell::AdjustWindowSize(const gfx::Size& initial_size) {
183 if (!initial_size.IsEmpty())
184 return initial_size;
pdrcab84ee2015-03-13 21:47:04185 return GetShellDefaultSize();
[email protected]a2904092013-10-15 04:53:59186}
187
[email protected]bdcf9152012-07-19 17:43:21188Shell* Shell::CreateNewWindow(BrowserContext* browser_context,
[email protected]e99ca5112011-09-26 17:22:54189 const GURL& url,
lukasza04130152016-10-21 20:26:32190 const scoped_refptr<SiteInstance>& site_instance,
[email protected]cdb806722013-01-10 14:18:23191 const gfx::Size& initial_size) {
[email protected]54944cde2012-12-09 09:24:59192 WebContents::CreateParams create_params(browser_context, site_instance);
[email protected]a2904092013-10-15 04:53:59193 create_params.initial_size = AdjustWindowSize(initial_size);
[email protected]54944cde2012-12-09 09:24:59194 WebContents* web_contents = WebContents::Create(create_params);
[email protected]c0d036d2013-05-07 12:50:50195 Shell* shell = CreateShell(web_contents, create_params.initial_size);
[email protected]e99ca5112011-09-26 17:22:54196 if (!url.is_empty())
197 shell->LoadURL(url);
[email protected]9fbd3f862011-09-20 23:31:34198 return shell;
199}
200
201void Shell::LoadURL(const GURL& url) {
[email protected]d2494ff2013-02-20 08:22:37202 LoadURLForFrame(url, std::string());
203}
204
205void Shell::LoadURLForFrame(const GURL& url, const std::string& frame_name) {
206 NavigationController::LoadURLParams params(url);
Sylvain Defresnec6ccc77d2014-09-19 10:19:35207 params.transition_type = ui::PageTransitionFromInt(
208 ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
[email protected]d2494ff2013-02-20 08:22:37209 params.frame_name = frame_name;
210 web_contents_->GetController().LoadURLWithParams(params);
[email protected]fc2b46b2014-05-03 16:33:45211 web_contents_->Focus();
[email protected]9fbd3f862011-09-20 23:31:34212}
213
[email protected]76bdecb2014-04-16 17:58:08214void Shell::LoadDataWithBaseURL(const GURL& url, const std::string& data,
215 const GURL& base_url) {
boliuec93ea92016-02-17 22:23:07216 bool load_as_string = false;
217 LoadDataWithBaseURLInternal(url, data, base_url, load_as_string);
218}
219
220#if defined(OS_ANDROID)
221void Shell::LoadDataAsStringWithBaseURL(const GURL& url,
222 const std::string& data,
223 const GURL& base_url) {
224 bool load_as_string = true;
225 LoadDataWithBaseURLInternal(url, data, base_url, load_as_string);
226}
227#endif
228
229void Shell::LoadDataWithBaseURLInternal(const GURL& url,
230 const std::string& data,
231 const GURL& base_url,
232 bool load_as_string) {
233#if !defined(OS_ANDROID)
234 DCHECK(!load_as_string); // Only supported on Android.
235#endif
236
237 NavigationController::LoadURLParams params(GURL::EmptyGURL());
238 const std::string data_url_header = "data:text/html;charset=utf-8,";
239 if (load_as_string) {
240 params.url = GURL(data_url_header);
241 std::string data_url_as_string = data_url_header + data;
242#if defined(OS_ANDROID)
243 params.data_url_as_string =
244 base::RefCountedString::TakeString(&data_url_as_string);
245#endif
246 } else {
247 params.url = GURL(data_url_header + data);
248 }
249
[email protected]76bdecb2014-04-16 17:58:08250 params.load_type = NavigationController::LOAD_TYPE_DATA;
251 params.base_url_for_data_url = base_url;
252 params.virtual_url_for_data_url = url;
253 params.override_user_agent = NavigationController::UA_OVERRIDE_FALSE;
254 web_contents_->GetController().LoadURLWithParams(params);
[email protected]fc2b46b2014-05-03 16:33:45255 web_contents_->Focus();
[email protected]76bdecb2014-04-16 17:58:08256}
257
[email protected]a2904092013-10-15 04:53:59258void Shell::AddNewContents(WebContents* source,
259 WebContents* new_contents,
260 WindowOpenDisposition disposition,
bokan107a47f2015-02-03 23:23:39261 const gfx::Rect& initial_rect,
[email protected]a2904092013-10-15 04:53:59262 bool user_gesture,
263 bool* was_blocked) {
bokan107a47f2015-02-03 23:23:39264 CreateShell(new_contents, AdjustWindowSize(initial_rect.size()));
lukasza381b0492016-03-10 16:48:43265 if (switches::IsRunLayoutTestSwitchPresent())
lukasza8e550a02016-04-18 18:34:17266 SecondaryTestWindowObserver::CreateForWebContents(new_contents);
[email protected]a2904092013-10-15 04:53:59267}
268
[email protected]9fbd3f862011-09-20 23:31:34269void Shell::GoBackOrForward(int offset) {
[email protected]0b659b32012-03-26 21:29:32270 web_contents_->GetController().GoToOffset(offset);
[email protected]fc2b46b2014-05-03 16:33:45271 web_contents_->Focus();
[email protected]9fbd3f862011-09-20 23:31:34272}
273
274void Shell::Reload() {
toyoshim6142d96f2016-12-19 09:07:25275 web_contents_->GetController().Reload(ReloadType::NORMAL, false);
[email protected]fc2b46b2014-05-03 16:33:45276 web_contents_->Focus();
[email protected]9fbd3f862011-09-20 23:31:34277}
278
toyoshime5aaf6a2016-05-18 08:07:48279void Shell::ReloadBypassingCache() {
toyoshim6142d96f2016-12-19 09:07:25280 web_contents_->GetController().Reload(ReloadType::BYPASSING_CACHE, false);
toyoshime5aaf6a2016-05-18 08:07:48281 web_contents_->Focus();
282}
283
[email protected]9fbd3f862011-09-20 23:31:34284void Shell::Stop() {
[email protected]0b659b32012-03-26 21:29:32285 web_contents_->Stop();
[email protected]fc2b46b2014-05-03 16:33:45286 web_contents_->Focus();
[email protected]9fbd3f862011-09-20 23:31:34287}
288
[email protected]e3b10d12014-03-28 16:06:09289void Shell::UpdateNavigationControls(bool to_different_document) {
[email protected]0b659b32012-03-26 21:29:32290 int current_index = web_contents_->GetController().GetCurrentEntryIndex();
291 int max_index = web_contents_->GetController().GetEntryCount() - 1;
[email protected]9fbd3f862011-09-20 23:31:34292
293 PlatformEnableUIControl(BACK_BUTTON, current_index > 0);
294 PlatformEnableUIControl(FORWARD_BUTTON, current_index < max_index);
[email protected]e3b10d12014-03-28 16:06:09295 PlatformEnableUIControl(STOP_BUTTON,
296 to_different_document && web_contents_->IsLoading());
[email protected]9fbd3f862011-09-20 23:31:34297}
298
[email protected]7c17b6992012-08-09 16:16:30299void Shell::ShowDevTools() {
mohsen6eb57fb2016-07-22 03:14:08300 if (!devtools_frontend_) {
301 devtools_frontend_ = ShellDevToolsFrontend::Show(web_contents());
302 devtools_observer_.reset(new DevToolsWebContentsObserver(
303 this, devtools_frontend_->frontend_shell()->web_contents()));
304 }
[email protected]3142e5d2014-02-07 00:54:46305
mohsen6eb57fb2016-07-22 03:14:08306 devtools_frontend_->Activate();
307 devtools_frontend_->Focus();
[email protected]7c17b6992012-08-09 16:16:30308}
309
[email protected]001841c92012-12-11 17:00:13310void Shell::CloseDevTools() {
[email protected]0773e0c2013-01-25 15:57:57311 if (!devtools_frontend_)
[email protected]001841c92012-12-11 17:00:13312 return;
[email protected]7fff43e2013-05-21 20:21:10313 devtools_observer_.reset();
[email protected]0773e0c2013-01-25 15:57:57314 devtools_frontend_->Close();
315 devtools_frontend_ = NULL;
[email protected]001841c92012-12-11 17:00:13316}
317
[email protected]9fbd3f862011-09-20 23:31:34318gfx::NativeView Shell::GetContentView() {
[email protected]59383c782013-04-17 16:43:27319 if (!web_contents_)
[email protected]9fbd3f862011-09-20 23:31:34320 return NULL;
[email protected]fc2b46b2014-05-03 16:33:45321 return web_contents_->GetNativeView();
[email protected]9fbd3f862011-09-20 23:31:34322}
323
alexmos5a98a052016-01-06 00:15:02324WebContents* Shell::OpenURLFromTab(WebContents* source,
325 const OpenURLParams& params) {
lukasza04130152016-10-21 20:26:32326 WebContents* target = nullptr;
327 switch (params.disposition) {
328 case WindowOpenDisposition::CURRENT_TAB:
329 target = source;
330 break;
331
332 // Normally, the difference between NEW_POPUP and NEW_WINDOW is that a popup
333 // should have no toolbar, no status bar, no menu bar, no scrollbars and be
334 // not resizable. For simplicity and to enable new testing scenarios in
335 // content shell and layout tests, popups don't get special treatment below
336 // (i.e. they will have a toolbar and other things described here).
337 case WindowOpenDisposition::NEW_POPUP:
lukaszabe2f0da2017-04-25 00:43:00338 case WindowOpenDisposition::NEW_WINDOW:
339 // content_shell doesn't really support tabs, but some layout tests use
340 // middle click (which translates into kNavigationPolicyNewBackgroundTab),
341 // so we treat the cases below just like a NEW_WINDOW disposition.
342 case WindowOpenDisposition::NEW_BACKGROUND_TAB:
343 case WindowOpenDisposition::NEW_FOREGROUND_TAB: {
lukasza04130152016-10-21 20:26:32344 Shell* new_window =
345 Shell::CreateNewWindow(source->GetBrowserContext(),
346 GURL(), // Don't load anything just yet.
347 params.source_site_instance,
348 gfx::Size()); // Use default size.
349 target = new_window->web_contents();
350 if (switches::IsRunLayoutTestSwitchPresent())
351 SecondaryTestWindowObserver::CreateForWebContents(target);
352 break;
353 }
354
355 // No tabs in content_shell:
356 case WindowOpenDisposition::SINGLETON_TAB:
lukasza04130152016-10-21 20:26:32357 // No incognito mode in content_shell:
358 case WindowOpenDisposition::OFF_THE_RECORD:
359 // TODO(lukasza): Investigate if some layout tests might need support for
360 // SAVE_TO_DISK disposition. This would probably require that
361 // BlinkTestController always sets up and cleans up a temporary directory
362 // as the default downloads destinations for the duration of a test.
363 case WindowOpenDisposition::SAVE_TO_DISK:
364 // Ignoring requests with disposition == IGNORE_ACTION...
365 case WindowOpenDisposition::IGNORE_ACTION:
366 default:
367 return nullptr;
368 }
alexmos5a98a052016-01-06 00:15:02369
370 NavigationController::LoadURLParams load_url_params(params.url);
371 load_url_params.source_site_instance = params.source_site_instance;
372 load_url_params.transition_type = params.transition;
373 load_url_params.frame_tree_node_id = params.frame_tree_node_id;
374 load_url_params.referrer = params.referrer;
375 load_url_params.redirect_chain = params.redirect_chain;
376 load_url_params.extra_headers = params.extra_headers;
377 load_url_params.is_renderer_initiated = params.is_renderer_initiated;
alexmos5a98a052016-01-06 00:15:02378 load_url_params.should_replace_current_entry =
379 params.should_replace_current_entry;
380
lukasza477a5a22016-06-16 18:28:43381 if (params.uses_post) {
382 load_url_params.load_type = NavigationController::LOAD_TYPE_HTTP_POST;
383 load_url_params.post_data = params.post_data;
alexmos5a98a052016-01-06 00:15:02384 }
385
lukasza04130152016-10-21 20:26:32386 target->GetController().LoadURLWithParams(load_url_params);
387 return target;
alexmos5a98a052016-01-06 00:15:02388}
389
[email protected]e3b10d12014-03-28 16:06:09390void Shell::LoadingStateChanged(WebContents* source,
391 bool to_different_document) {
392 UpdateNavigationControls(to_different_document);
[email protected]15aea412012-01-19 03:18:50393 PlatformSetIsLoading(source->IsLoading());
[email protected]e99ca5112011-09-26 17:22:54394}
395
mlamouri7a78d6fd2015-01-17 13:23:53396void Shell::EnterFullscreenModeForTab(WebContents* web_contents,
397 const GURL& origin) {
398 ToggleFullscreenModeForTab(web_contents, true);
399}
400
401void Shell::ExitFullscreenModeForTab(WebContents* web_contents) {
402 ToggleFullscreenModeForTab(web_contents, false);
403}
404
[email protected]99c014c2012-11-27 12:03:42405void Shell::ToggleFullscreenModeForTab(WebContents* web_contents,
406 bool enter_fullscreen) {
407#if defined(OS_ANDROID)
408 PlatformToggleFullscreenModeForTab(web_contents, enter_fullscreen);
409#endif
lukasza381b0492016-03-10 16:48:43410 if (!switches::IsRunLayoutTestSwitchPresent())
[email protected]99c014c2012-11-27 12:03:42411 return;
412 if (is_fullscreen_ != enter_fullscreen) {
413 is_fullscreen_ = enter_fullscreen;
avif9ab5d942015-10-15 14:05:44414 web_contents->GetRenderViewHost()->GetWidget()->WasResized();
[email protected]99c014c2012-11-27 12:03:42415 }
416}
417
418bool Shell::IsFullscreenForTabOrPending(const WebContents* web_contents) const {
419#if defined(OS_ANDROID)
420 return PlatformIsFullscreenForTabOrPending(web_contents);
421#else
422 return is_fullscreen_;
423#endif
424}
425
mikhail.pozdnyakovc0e251b2015-04-15 06:51:12426blink::WebDisplayMode Shell::GetDisplayMode(
427 const WebContents* web_contents) const {
428 // TODO : should return blink::WebDisplayModeFullscreen wherever user puts
429 // a browser window into fullscreen (not only in case of renderer-initiated
430 // fullscreen mode): crbug.com/476874.
Blink Reformat1c4d759e2017-04-09 16:34:54431 return IsFullscreenForTabOrPending(web_contents)
432 ? blink::kWebDisplayModeFullscreen
433 : blink::kWebDisplayModeBrowser;
mikhail.pozdnyakovc0e251b2015-04-15 06:51:12434}
435
[email protected]f78439002012-11-28 14:45:59436void Shell::RequestToLockMouse(WebContents* web_contents,
437 bool user_gesture,
438 bool last_unlocked_by_target) {
439 web_contents->GotResponseToLockMouseRequest(true);
440}
441
[email protected]9e00e6352012-07-30 17:05:18442void Shell::CloseContents(WebContents* source) {
443 Close();
444}
445
[email protected]067310262012-11-22 14:30:41446bool Shell::CanOverscrollContent() const {
447#if defined(USE_AURA)
448 return true;
449#else
450 return false;
451#endif
452}
453
[email protected]3bbacc5b2012-04-17 17:46:15454void Shell::DidNavigateMainFramePostCommit(WebContents* web_contents) {
[email protected]4e3c7522013-08-13 11:53:18455 PlatformSetAddressBarURL(web_contents->GetLastCommittedURL());
[email protected]e99ca5112011-09-26 17:22:54456}
457
mathiash72a5e462014-11-19 08:18:50458JavaScriptDialogManager* Shell::GetJavaScriptDialogManager(
459 WebContents* source) {
mkwst6efe7f2e62014-10-08 15:09:01460 if (!dialog_manager_) {
lukasza381b0492016-03-10 16:48:43461 dialog_manager_.reset(switches::IsRunLayoutTestSwitchPresent()
462 ? new LayoutTestJavaScriptDialogManager
463 : new ShellJavaScriptDialogManager);
mkwst6efe7f2e62014-10-08 15:09:01464 }
[email protected]71a88bb2013-02-01 22:05:15465 return dialog_manager_.get();
[email protected]f2210022012-03-29 00:36:08466}
467
dcheng6003e0b2016-04-09 18:42:34468std::unique_ptr<BluetoothChooser> Shell::RunBluetoothChooser(
jyasskin93649a52016-02-17 19:57:02469 RenderFrameHost* frame,
470 const BluetoothChooser::EventHandler& event_handler) {
lukasza381b0492016-03-10 16:48:43471 if (switches::IsRunLayoutTestSwitchPresent()) {
jyasskin93649a52016-02-17 19:57:02472 return BlinkTestController::Get()->RunBluetoothChooser(frame,
473 event_handler);
jyasskin8057c002015-09-10 19:09:53474 }
475 return nullptr;
476}
477
avia90ae4e2016-11-11 20:49:33478bool Shell::DidAddMessageToConsole(WebContents* source,
479 int32_t level,
480 const base::string16& message,
481 int32_t line_no,
482 const base::string16& source_id) {
lukasza381b0492016-03-10 16:48:43483 return switches::IsRunLayoutTestSwitchPresent();
[email protected]efb5f572012-01-29 10:57:33484}
485
dtapuskae99ec6e52016-10-18 00:15:42486void Shell::RendererUnresponsive(
487 WebContents* source,
488 const WebContentsUnresponsiveState& unresponsive_state) {
lukasza381b0492016-03-10 16:48:43489 if (switches::IsRunLayoutTestSwitchPresent())
490 BlinkTestController::Get()->RendererUnresponsive();
[email protected]5bf68f22012-08-31 07:38:10491}
492
[email protected]233567d2013-02-27 20:22:02493void Shell::ActivateContents(WebContents* contents) {
avif9ab5d942015-10-15 14:05:44494 contents->GetRenderViewHost()->GetWidget()->Focus();
[email protected]233567d2013-02-27 20:22:02495}
496
carloskd9d97942017-02-16 08:58:09497bool Shell::ShouldAllowRunningInsecureContent(
498 content::WebContents* web_contents,
499 bool allowed_per_prefs,
500 const url::Origin& origin,
501 const GURL& resource_url) {
502 bool allowed_by_test = false;
503 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
504 switches::kRunLayoutTest)) {
505 const base::DictionaryValue& test_flags =
506 BlinkTestController::Get()
507 ->accumulated_layout_test_runtime_flags_changes();
508 test_flags.GetBoolean("running_insecure_content_allowed", &allowed_by_test);
509 }
510
511 return allowed_per_prefs || allowed_by_test;
512}
513
pdrcab84ee2015-03-13 21:47:04514gfx::Size Shell::GetShellDefaultSize() {
515 static gfx::Size default_shell_size;
516 if (!default_shell_size.IsEmpty())
517 return default_shell_size;
518 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
519 if (command_line->HasSwitch(switches::kContentShellHostWindowSize)) {
520 const std::string size_str = command_line->GetSwitchValueASCII(
521 switches::kContentShellHostWindowSize);
522 int width, height;
523 CHECK_EQ(2, sscanf(size_str.c_str(), "%dx%d", &width, &height));
524 default_shell_size = gfx::Size(width, height);
525 } else {
526 default_shell_size = gfx::Size(
527 kDefaultTestWindowWidthDip, kDefaultTestWindowHeightDip);
528 }
529 return default_shell_size;
530}
531
Avi Drissman93002212017-09-27 03:20:52532void Shell::TitleWasSet(NavigationEntry* entry) {
[email protected]1ef02d242013-10-07 16:18:53533 if (entry)
534 PlatformSetTitle(entry->GetTitle());
[email protected]aecc085b2012-06-01 18:15:53535}
536
[email protected]7fff43e2013-05-21 20:21:10537void Shell::OnDevToolsWebContentsDestroyed() {
538 devtools_observer_.reset();
539 devtools_frontend_ = NULL;
540}
541
[email protected]9fbd3f862011-09-20 23:31:34542} // namespace content