blob: 0e8b8b731fa333e89b3bdec3259aeb3cb2acc1e1 [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
[email protected]11a65b692012-03-30 11:29:167#include "base/auto_reset.h"
[email protected]efb5f572012-01-29 10:57:338#include "base/command_line.h"
skyostil95082a62015-06-05 19:53:079#include "base/location.h"
10#include "base/single_thread_task_runner.h"
[email protected]21aa99682013-06-11 07:17:0111#include "base/strings/string_number_conversions.h"
12#include "base/strings/string_util.h"
13#include "base/strings/stringprintf.h"
[email protected]74ebfb12013-06-07 20:48:0014#include "base/strings/utf_string_conversions.h"
skyostil95082a62015-06-05 19:53:0715#include "base/thread_task_runner_handle.h"
[email protected]b50452f2014-08-18 12:31:4416#include "content/public/browser/devtools_agent_host.h"
[email protected]0b659b32012-03-26 21:29:3217#include "content/public/browser/navigation_controller.h"
[email protected]b7c504c2013-05-07 14:42:1218#include "content/public/browser/navigation_entry.h"
[email protected]0b659b32012-03-26 21:29:3219#include "content/public/browser/render_view_host.h"
avif9ab5d942015-10-15 14:05:4420#include "content/public/browser/render_widget_host.h"
[email protected]0b659b32012-03-26 21:29:3221#include "content/public/browser/web_contents.h"
[email protected]7fff43e2013-05-21 20:21:1022#include "content/public/browser/web_contents_observer.h"
guoweis8efb6d892015-10-12 18:26:1723#include "content/public/common/content_switches.h"
[email protected]1596efb2013-01-17 22:13:0124#include "content/public/common/renderer_preferences.h"
guoweisc537ba22015-11-06 21:20:3125#include "content/public/common/webrtc_ip_handling_policy.h"
tfarinacde91252015-05-06 16:10:4926#include "content/shell/browser/blink_test_controller.h"
jyasskin8057c002015-09-10 19:09:5327#include "content/shell/browser/layout_test/layout_test_bluetooth_chooser_factory.h"
mkwst30d20d52014-10-09 13:33:1428#include "content/shell/browser/layout_test/layout_test_devtools_frontend.h"
mkwst6efe7f2e62014-10-08 15:09:0129#include "content/shell/browser/layout_test/layout_test_javascript_dialog_manager.h"
[email protected]de7d61ff2013-08-20 11:30:4130#include "content/shell/browser/notify_done_forwarder.h"
31#include "content/shell/browser/shell_browser_main_parts.h"
32#include "content/shell/browser/shell_content_browser_client.h"
33#include "content/shell/browser/shell_devtools_frontend.h"
34#include "content/shell/browser/shell_javascript_dialog_manager.h"
[email protected]b7c504c2013-05-07 14:42:1235#include "content/shell/common/shell_messages.h"
36#include "content/shell/common/shell_switches.h"
[email protected]9fbd3f862011-09-20 23:31:3437
[email protected]9fbd3f862011-09-20 23:31:3438namespace content {
39
pdrcab84ee2015-03-13 21:47:0440const int kDefaultTestWindowWidthDip = 800;
41const int kDefaultTestWindowHeightDip = 600;
[email protected]1e57cab2013-05-28 04:26:1142
[email protected]e99ca5112011-09-26 17:22:5443std::vector<Shell*> Shell::windows_;
[email protected]9e00e6352012-07-30 17:05:1844base::Callback<void(Shell*)> Shell::shell_created_callback_;
[email protected]9fbd3f862011-09-20 23:31:3445
[email protected]11a65b692012-03-30 11:29:1646bool Shell::quit_message_loop_ = true;
47
[email protected]7fff43e2013-05-21 20:21:1048class Shell::DevToolsWebContentsObserver : public WebContentsObserver {
49 public:
50 DevToolsWebContentsObserver(Shell* shell, WebContents* web_contents)
51 : WebContentsObserver(web_contents),
52 shell_(shell) {
53 }
54
55 // WebContentsObserver
dchenge933b3e2014-10-21 11:44:0956 void WebContentsDestroyed() override {
[email protected]7fff43e2013-05-21 20:21:1057 shell_->OnDevToolsWebContentsDestroyed();
58 }
59
60 private:
61 Shell* shell_;
62
63 DISALLOW_COPY_AND_ASSIGN(DevToolsWebContentsObserver);
64};
65
[email protected]0b659b32012-03-26 21:29:3266Shell::Shell(WebContents* web_contents)
[email protected]1ef02d242013-10-07 16:18:5367 : WebContentsObserver(web_contents),
68 devtools_frontend_(NULL),
[email protected]001841c92012-12-11 17:00:1369 is_fullscreen_(false),
[email protected]99c014c2012-11-27 12:03:4270 window_(NULL),
[email protected]86b36e672012-12-21 00:09:5171 url_edit_view_(NULL),
[email protected]86b36e672012-12-21 00:09:5172 headless_(false) {
avi83883c82014-12-23 00:08:4973 const base::CommandLine& command_line =
74 *base::CommandLine::ForCurrentProcess();
paulmeyerbcc6ad22015-02-11 21:51:5975 if (command_line.HasSwitch(switches::kRunLayoutTest))
[email protected]86b36e672012-12-21 00:09:5176 headless_ = true;
[email protected]9e00e6352012-07-30 17:05:1877 windows_.push_back(this);
78
79 if (!shell_created_callback_.is_null()) {
80 shell_created_callback_.Run(this);
81 shell_created_callback_.Reset();
82 }
[email protected]9fbd3f862011-09-20 23:31:3483}
84
85Shell::~Shell() {
86 PlatformCleanUp();
[email protected]e99ca5112011-09-26 17:22:5487
88 for (size_t i = 0; i < windows_.size(); ++i) {
89 if (windows_[i] == this) {
90 windows_.erase(windows_.begin() + i);
91 break;
92 }
93 }
[email protected]11a65b692012-03-30 11:29:1694
[email protected]b53adf452014-02-07 12:55:0895 if (windows_.empty() && quit_message_loop_) {
96 if (headless_)
97 PlatformExit();
skyostil95082a62015-06-05 19:53:0798 base::ThreadTaskRunnerHandle::Get()->PostTask(
ki.stfu800779242015-10-12 22:46:2699 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
[email protected]b53adf452014-02-07 12:55:08100 }
[email protected]9fbd3f862011-09-20 23:31:34101}
102
[email protected]c0d036d2013-05-07 12:50:50103Shell* Shell::CreateShell(WebContents* web_contents,
104 const gfx::Size& initial_size) {
[email protected]0b659b32012-03-26 21:29:32105 Shell* shell = new Shell(web_contents);
[email protected]c0d036d2013-05-07 12:50:50106 shell->PlatformCreateWindow(initial_size.width(), initial_size.height());
[email protected]3fd84032012-01-12 18:20:17107
[email protected]0b659b32012-03-26 21:29:32108 shell->web_contents_.reset(web_contents);
109 web_contents->SetDelegate(shell);
[email protected]3fd84032012-01-12 18:20:17110
[email protected]5cba3bf2012-01-14 02:40:35111 shell->PlatformSetContents();
[email protected]3fd84032012-01-12 18:20:17112
113 shell->PlatformResizeSubViews();
[email protected]1596efb2013-01-17 22:13:01114
avi83883c82014-12-23 00:08:49115 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
paulmeyerbcc6ad22015-02-11 21:51:59116 switches::kRunLayoutTest)) {
[email protected]1596efb2013-01-17 22:13:01117 web_contents->GetMutableRendererPrefs()->use_custom_colors = false;
118 web_contents->GetRenderViewHost()->SyncRendererPrefs();
119 }
120
guoweis8efb6d892015-10-12 18:26:17121#if defined(ENABLE_WEBRTC)
122 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
123 switches::kDisableWebRtcMultipleRoutes)) {
guoweisc537ba22015-11-06 21:20:31124 web_contents->GetMutableRendererPrefs()->webrtc_ip_handling_policy =
125 kWebRTCIPHandlingDefaultPublicInterfaceOnly;
guoweis8efb6d892015-10-12 18:26:17126 }
127#endif
128
[email protected]3fd84032012-01-12 18:20:17129 return shell;
130}
131
[email protected]11a65b692012-03-30 11:29:16132void Shell::CloseAllWindows() {
[email protected]997ec9f2012-11-21 04:44:14133 base::AutoReset<bool> auto_reset(&quit_message_loop_, false);
[email protected]b50452f2014-08-18 12:31:44134 DevToolsAgentHost::DetachAllClients();
[email protected]11a65b692012-03-30 11:29:16135 std::vector<Shell*> open_windows(windows_);
136 for (size_t i = 0; i < open_windows.size(); ++i)
137 open_windows[i]->Close();
[email protected]dd32b1272013-05-04 14:17:11138 base::MessageLoop::current()->RunUntilIdle();
dmazzoni948fbc72015-05-17 07:57:33139 PlatformExit();
[email protected]11a65b692012-03-30 11:29:16140}
141
[email protected]9e00e6352012-07-30 17:05:18142void Shell::SetShellCreatedCallback(
143 base::Callback<void(Shell*)> shell_created_callback) {
144 DCHECK(shell_created_callback_.is_null());
145 shell_created_callback_ = shell_created_callback;
146}
147
[email protected]74830f02012-01-30 22:27:04148Shell* Shell::FromRenderViewHost(RenderViewHost* rvh) {
149 for (size_t i = 0; i < windows_.size(); ++i) {
[email protected]0b659b32012-03-26 21:29:32150 if (windows_[i]->web_contents() &&
151 windows_[i]->web_contents()->GetRenderViewHost() == rvh) {
[email protected]74830f02012-01-30 22:27:04152 return windows_[i];
153 }
154 }
155 return NULL;
156}
157
[email protected]6153b272013-01-25 22:29:23158// static
159void Shell::Initialize() {
pdrcab84ee2015-03-13 21:47:04160 PlatformInitialize(GetShellDefaultSize());
[email protected]6153b272013-01-25 22:29:23161}
162
[email protected]a2904092013-10-15 04:53:59163gfx::Size Shell::AdjustWindowSize(const gfx::Size& initial_size) {
164 if (!initial_size.IsEmpty())
165 return initial_size;
pdrcab84ee2015-03-13 21:47:04166 return GetShellDefaultSize();
[email protected]a2904092013-10-15 04:53:59167}
168
[email protected]bdcf9152012-07-19 17:43:21169Shell* Shell::CreateNewWindow(BrowserContext* browser_context,
[email protected]e99ca5112011-09-26 17:22:54170 const GURL& url,
171 SiteInstance* site_instance,
[email protected]cdb806722013-01-10 14:18:23172 const gfx::Size& initial_size) {
[email protected]54944cde2012-12-09 09:24:59173 WebContents::CreateParams create_params(browser_context, site_instance);
[email protected]a2904092013-10-15 04:53:59174 create_params.initial_size = AdjustWindowSize(initial_size);
[email protected]54944cde2012-12-09 09:24:59175 WebContents* web_contents = WebContents::Create(create_params);
[email protected]c0d036d2013-05-07 12:50:50176 Shell* shell = CreateShell(web_contents, create_params.initial_size);
[email protected]e99ca5112011-09-26 17:22:54177 if (!url.is_empty())
178 shell->LoadURL(url);
[email protected]9fbd3f862011-09-20 23:31:34179 return shell;
180}
181
182void Shell::LoadURL(const GURL& url) {
[email protected]d2494ff2013-02-20 08:22:37183 LoadURLForFrame(url, std::string());
184}
185
186void Shell::LoadURLForFrame(const GURL& url, const std::string& frame_name) {
187 NavigationController::LoadURLParams params(url);
Sylvain Defresnec6ccc77d2014-09-19 10:19:35188 params.transition_type = ui::PageTransitionFromInt(
189 ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
[email protected]d2494ff2013-02-20 08:22:37190 params.frame_name = frame_name;
191 web_contents_->GetController().LoadURLWithParams(params);
[email protected]fc2b46b2014-05-03 16:33:45192 web_contents_->Focus();
[email protected]9fbd3f862011-09-20 23:31:34193}
194
[email protected]76bdecb2014-04-16 17:58:08195void Shell::LoadDataWithBaseURL(const GURL& url, const std::string& data,
196 const GURL& base_url) {
197 const GURL data_url = GURL("data:text/html;charset=utf-8," + data);
198 NavigationController::LoadURLParams params(data_url);
199 params.load_type = NavigationController::LOAD_TYPE_DATA;
200 params.base_url_for_data_url = base_url;
201 params.virtual_url_for_data_url = url;
202 params.override_user_agent = NavigationController::UA_OVERRIDE_FALSE;
203 web_contents_->GetController().LoadURLWithParams(params);
[email protected]fc2b46b2014-05-03 16:33:45204 web_contents_->Focus();
[email protected]76bdecb2014-04-16 17:58:08205}
206
[email protected]a2904092013-10-15 04:53:59207void Shell::AddNewContents(WebContents* source,
208 WebContents* new_contents,
209 WindowOpenDisposition disposition,
bokan107a47f2015-02-03 23:23:39210 const gfx::Rect& initial_rect,
[email protected]a2904092013-10-15 04:53:59211 bool user_gesture,
212 bool* was_blocked) {
bokan107a47f2015-02-03 23:23:39213 CreateShell(new_contents, AdjustWindowSize(initial_rect.size()));
avi83883c82014-12-23 00:08:49214 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
paulmeyerbcc6ad22015-02-11 21:51:59215 switches::kRunLayoutTest))
[email protected]a2904092013-10-15 04:53:59216 NotifyDoneForwarder::CreateForWebContents(new_contents);
217}
218
[email protected]9fbd3f862011-09-20 23:31:34219void Shell::GoBackOrForward(int offset) {
[email protected]0b659b32012-03-26 21:29:32220 web_contents_->GetController().GoToOffset(offset);
[email protected]fc2b46b2014-05-03 16:33:45221 web_contents_->Focus();
[email protected]9fbd3f862011-09-20 23:31:34222}
223
224void Shell::Reload() {
[email protected]0b659b32012-03-26 21:29:32225 web_contents_->GetController().Reload(false);
[email protected]fc2b46b2014-05-03 16:33:45226 web_contents_->Focus();
[email protected]9fbd3f862011-09-20 23:31:34227}
228
229void Shell::Stop() {
[email protected]0b659b32012-03-26 21:29:32230 web_contents_->Stop();
[email protected]fc2b46b2014-05-03 16:33:45231 web_contents_->Focus();
[email protected]9fbd3f862011-09-20 23:31:34232}
233
[email protected]e3b10d12014-03-28 16:06:09234void Shell::UpdateNavigationControls(bool to_different_document) {
[email protected]0b659b32012-03-26 21:29:32235 int current_index = web_contents_->GetController().GetCurrentEntryIndex();
236 int max_index = web_contents_->GetController().GetEntryCount() - 1;
[email protected]9fbd3f862011-09-20 23:31:34237
238 PlatformEnableUIControl(BACK_BUTTON, current_index > 0);
239 PlatformEnableUIControl(FORWARD_BUTTON, current_index < max_index);
[email protected]e3b10d12014-03-28 16:06:09240 PlatformEnableUIControl(STOP_BUTTON,
241 to_different_document && web_contents_->IsLoading());
[email protected]9fbd3f862011-09-20 23:31:34242}
243
[email protected]7c17b6992012-08-09 16:16:30244void Shell::ShowDevTools() {
pfeldman552756452015-02-03 17:33:06245 InnerShowDevTools();
[email protected]3142e5d2014-02-07 00:54:46246}
247
248void Shell::ShowDevToolsForElementAt(int x, int y) {
pfeldman552756452015-02-03 17:33:06249 InnerShowDevTools();
[email protected]2317fcd2014-02-10 14:36:48250 devtools_frontend_->InspectElementAt(x, y);
[email protected]7c17b6992012-08-09 16:16:30251}
252
[email protected]001841c92012-12-11 17:00:13253void Shell::CloseDevTools() {
[email protected]0773e0c2013-01-25 15:57:57254 if (!devtools_frontend_)
[email protected]001841c92012-12-11 17:00:13255 return;
[email protected]7fff43e2013-05-21 20:21:10256 devtools_observer_.reset();
[email protected]0773e0c2013-01-25 15:57:57257 devtools_frontend_->Close();
258 devtools_frontend_ = NULL;
[email protected]001841c92012-12-11 17:00:13259}
260
[email protected]9fbd3f862011-09-20 23:31:34261gfx::NativeView Shell::GetContentView() {
[email protected]59383c782013-04-17 16:43:27262 if (!web_contents_)
[email protected]9fbd3f862011-09-20 23:31:34263 return NULL;
[email protected]fc2b46b2014-05-03 16:33:45264 return web_contents_->GetNativeView();
[email protected]9fbd3f862011-09-20 23:31:34265}
266
[email protected]9e00e6352012-07-30 17:05:18267WebContents* Shell::OpenURLFromTab(WebContents* source,
268 const OpenURLParams& params) {
[email protected]7cf38302013-08-29 12:23:46269 // CURRENT_TAB is the only one we implement for now.
270 if (params.disposition != CURRENT_TAB)
271 return NULL;
[email protected]fbaccee2013-08-12 23:24:02272 NavigationController::LoadURLParams load_url_params(params.url);
lfg9ef7d2d2014-12-15 22:32:30273 load_url_params.source_site_instance = params.source_site_instance;
[email protected]fbaccee2013-08-12 23:24:02274 load_url_params.referrer = params.referrer;
[email protected]c80297782013-11-21 07:10:16275 load_url_params.frame_tree_node_id = params.frame_tree_node_id;
[email protected]fbaccee2013-08-12 23:24:02276 load_url_params.transition_type = params.transition;
277 load_url_params.extra_headers = params.extra_headers;
278 load_url_params.should_replace_current_entry =
279 params.should_replace_current_entry;
280
281 if (params.transferred_global_request_id != GlobalRequestID()) {
282 load_url_params.is_renderer_initiated = params.is_renderer_initiated;
283 load_url_params.transferred_global_request_id =
284 params.transferred_global_request_id;
285 } else if (params.is_renderer_initiated) {
286 load_url_params.is_renderer_initiated = true;
287 }
288
289 source->GetController().LoadURLWithParams(load_url_params);
[email protected]9e00e6352012-07-30 17:05:18290 return source;
291}
292
[email protected]e3b10d12014-03-28 16:06:09293void Shell::LoadingStateChanged(WebContents* source,
294 bool to_different_document) {
295 UpdateNavigationControls(to_different_document);
[email protected]15aea412012-01-19 03:18:50296 PlatformSetIsLoading(source->IsLoading());
[email protected]e99ca5112011-09-26 17:22:54297}
298
mlamouri7a78d6fd2015-01-17 13:23:53299void Shell::EnterFullscreenModeForTab(WebContents* web_contents,
300 const GURL& origin) {
301 ToggleFullscreenModeForTab(web_contents, true);
302}
303
304void Shell::ExitFullscreenModeForTab(WebContents* web_contents) {
305 ToggleFullscreenModeForTab(web_contents, false);
306}
307
[email protected]99c014c2012-11-27 12:03:42308void Shell::ToggleFullscreenModeForTab(WebContents* web_contents,
309 bool enter_fullscreen) {
310#if defined(OS_ANDROID)
311 PlatformToggleFullscreenModeForTab(web_contents, enter_fullscreen);
312#endif
avi83883c82014-12-23 00:08:49313 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
paulmeyerbcc6ad22015-02-11 21:51:59314 switches::kRunLayoutTest))
[email protected]99c014c2012-11-27 12:03:42315 return;
316 if (is_fullscreen_ != enter_fullscreen) {
317 is_fullscreen_ = enter_fullscreen;
avif9ab5d942015-10-15 14:05:44318 web_contents->GetRenderViewHost()->GetWidget()->WasResized();
[email protected]99c014c2012-11-27 12:03:42319 }
320}
321
322bool Shell::IsFullscreenForTabOrPending(const WebContents* web_contents) const {
323#if defined(OS_ANDROID)
324 return PlatformIsFullscreenForTabOrPending(web_contents);
325#else
326 return is_fullscreen_;
327#endif
328}
329
mikhail.pozdnyakovc0e251b2015-04-15 06:51:12330blink::WebDisplayMode Shell::GetDisplayMode(
331 const WebContents* web_contents) const {
332 // TODO : should return blink::WebDisplayModeFullscreen wherever user puts
333 // a browser window into fullscreen (not only in case of renderer-initiated
334 // fullscreen mode): crbug.com/476874.
335 return IsFullscreenForTabOrPending(web_contents) ?
336 blink::WebDisplayModeFullscreen : blink::WebDisplayModeBrowser;
337}
338
[email protected]f78439002012-11-28 14:45:59339void Shell::RequestToLockMouse(WebContents* web_contents,
340 bool user_gesture,
341 bool last_unlocked_by_target) {
342 web_contents->GotResponseToLockMouseRequest(true);
343}
344
[email protected]9e00e6352012-07-30 17:05:18345void Shell::CloseContents(WebContents* source) {
346 Close();
347}
348
[email protected]067310262012-11-22 14:30:41349bool Shell::CanOverscrollContent() const {
350#if defined(USE_AURA)
351 return true;
352#else
353 return false;
354#endif
355}
356
[email protected]3bbacc5b2012-04-17 17:46:15357void Shell::DidNavigateMainFramePostCommit(WebContents* web_contents) {
[email protected]4e3c7522013-08-13 11:53:18358 PlatformSetAddressBarURL(web_contents->GetLastCommittedURL());
[email protected]e99ca5112011-09-26 17:22:54359}
360
mathiash72a5e462014-11-19 08:18:50361JavaScriptDialogManager* Shell::GetJavaScriptDialogManager(
362 WebContents* source) {
mkwst6efe7f2e62014-10-08 15:09:01363 if (!dialog_manager_) {
avi83883c82014-12-23 00:08:49364 const base::CommandLine& command_line =
365 *base::CommandLine::ForCurrentProcess();
paulmeyerbcc6ad22015-02-11 21:51:59366 dialog_manager_.reset(command_line.HasSwitch(switches::kRunLayoutTest)
mkwst6efe7f2e62014-10-08 15:09:01367 ? new LayoutTestJavaScriptDialogManager
368 : new ShellJavaScriptDialogManager);
369 }
[email protected]71a88bb2013-02-01 22:05:15370 return dialog_manager_.get();
[email protected]f2210022012-03-29 00:36:08371}
372
jyasskin8057c002015-09-10 19:09:53373scoped_ptr<BluetoothChooser> Shell::RunBluetoothChooser(
374 WebContents* web_contents,
375 const BluetoothChooser::EventHandler& event_handler,
376 const GURL& origin) {
377 const base::CommandLine& command_line =
378 *base::CommandLine::ForCurrentProcess();
379 if (command_line.HasSwitch(switches::kRunLayoutTest)) {
380 return BlinkTestController::Get()->RunBluetoothChooser(
381 web_contents, event_handler, origin);
382 }
383 return nullptr;
384}
385
[email protected]c272c5b2012-06-06 09:01:06386bool Shell::AddMessageToConsole(WebContents* source,
387 int32 level,
[email protected]fcf75d42013-12-03 20:11:26388 const base::string16& message,
[email protected]c272c5b2012-06-06 09:01:06389 int32 line_no,
[email protected]fcf75d42013-12-03 20:11:26390 const base::string16& source_id) {
avi83883c82014-12-23 00:08:49391 return base::CommandLine::ForCurrentProcess()->HasSwitch(
paulmeyerbcc6ad22015-02-11 21:51:59392 switches::kRunLayoutTest);
[email protected]efb5f572012-01-29 10:57:33393}
394
[email protected]5bf68f22012-08-31 07:38:10395void Shell::RendererUnresponsive(WebContents* source) {
avi83883c82014-12-23 00:08:49396 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
paulmeyerbcc6ad22015-02-11 21:51:59397 switches::kRunLayoutTest))
[email protected]5bf68f22012-08-31 07:38:10398 return;
tfarinacde91252015-05-06 16:10:49399 BlinkTestController::Get()->RendererUnresponsive();
[email protected]5bf68f22012-08-31 07:38:10400}
401
[email protected]233567d2013-02-27 20:22:02402void Shell::ActivateContents(WebContents* contents) {
avif9ab5d942015-10-15 14:05:44403 contents->GetRenderViewHost()->GetWidget()->Focus();
[email protected]233567d2013-02-27 20:22:02404}
405
[email protected]3142e5d2014-02-07 00:54:46406bool Shell::HandleContextMenu(const content::ContextMenuParams& params) {
407 return PlatformHandleContextMenu(params);
408}
409
pdrcab84ee2015-03-13 21:47:04410gfx::Size Shell::GetShellDefaultSize() {
411 static gfx::Size default_shell_size;
412 if (!default_shell_size.IsEmpty())
413 return default_shell_size;
414 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
415 if (command_line->HasSwitch(switches::kContentShellHostWindowSize)) {
416 const std::string size_str = command_line->GetSwitchValueASCII(
417 switches::kContentShellHostWindowSize);
418 int width, height;
419 CHECK_EQ(2, sscanf(size_str.c_str(), "%dx%d", &width, &height));
420 default_shell_size = gfx::Size(width, height);
421 } else {
422 default_shell_size = gfx::Size(
423 kDefaultTestWindowWidthDip, kDefaultTestWindowHeightDip);
424 }
425 return default_shell_size;
426}
427
[email protected]1ef02d242013-10-07 16:18:53428void Shell::TitleWasSet(NavigationEntry* entry, bool explicit_set) {
429 if (entry)
430 PlatformSetTitle(entry->GetTitle());
[email protected]aecc085b2012-06-01 18:15:53431}
432
pfeldman552756452015-02-03 17:33:06433void Shell::InnerShowDevTools() {
[email protected]fee9eca02014-02-14 19:24:40434 if (!devtools_frontend_) {
pfeldman552756452015-02-03 17:33:06435 devtools_frontend_ = ShellDevToolsFrontend::Show(web_contents());
[email protected]fee9eca02014-02-14 19:24:40436 devtools_observer_.reset(new DevToolsWebContentsObserver(
437 this, devtools_frontend_->frontend_shell()->web_contents()));
438 }
439
440 devtools_frontend_->Activate();
441 devtools_frontend_->Focus();
442}
443
[email protected]7fff43e2013-05-21 20:21:10444void Shell::OnDevToolsWebContentsDestroyed() {
445 devtools_observer_.reset();
446 devtools_frontend_ = NULL;
447}
448
[email protected]9fbd3f862011-09-20 23:31:34449} // namespace content