blob: d903e620bbc490f989ad6d63df97534d70aebb09 [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"
20#include "content/public/browser/web_contents.h"
[email protected]7fff43e2013-05-21 20:21:1021#include "content/public/browser/web_contents_observer.h"
guoweis8efb6d892015-10-12 18:26:1722#include "content/public/common/content_switches.h"
[email protected]1596efb2013-01-17 22:13:0123#include "content/public/common/renderer_preferences.h"
tfarinacde91252015-05-06 16:10:4924#include "content/shell/browser/blink_test_controller.h"
jyasskin8057c002015-09-10 19:09:5325#include "content/shell/browser/layout_test/layout_test_bluetooth_chooser_factory.h"
mkwst30d20d52014-10-09 13:33:1426#include "content/shell/browser/layout_test/layout_test_devtools_frontend.h"
mkwst6efe7f2e62014-10-08 15:09:0127#include "content/shell/browser/layout_test/layout_test_javascript_dialog_manager.h"
[email protected]de7d61ff2013-08-20 11:30:4128#include "content/shell/browser/notify_done_forwarder.h"
29#include "content/shell/browser/shell_browser_main_parts.h"
30#include "content/shell/browser/shell_content_browser_client.h"
31#include "content/shell/browser/shell_devtools_frontend.h"
32#include "content/shell/browser/shell_javascript_dialog_manager.h"
[email protected]b7c504c2013-05-07 14:42:1233#include "content/shell/common/shell_messages.h"
34#include "content/shell/common/shell_switches.h"
[email protected]9fbd3f862011-09-20 23:31:3435
[email protected]9fbd3f862011-09-20 23:31:3436namespace content {
37
pdrcab84ee2015-03-13 21:47:0438const int kDefaultTestWindowWidthDip = 800;
39const int kDefaultTestWindowHeightDip = 600;
[email protected]1e57cab2013-05-28 04:26:1140
[email protected]e99ca5112011-09-26 17:22:5441std::vector<Shell*> Shell::windows_;
[email protected]9e00e6352012-07-30 17:05:1842base::Callback<void(Shell*)> Shell::shell_created_callback_;
[email protected]9fbd3f862011-09-20 23:31:3443
[email protected]11a65b692012-03-30 11:29:1644bool Shell::quit_message_loop_ = true;
45
[email protected]7fff43e2013-05-21 20:21:1046class Shell::DevToolsWebContentsObserver : public WebContentsObserver {
47 public:
48 DevToolsWebContentsObserver(Shell* shell, WebContents* web_contents)
49 : WebContentsObserver(web_contents),
50 shell_(shell) {
51 }
52
53 // WebContentsObserver
dchenge933b3e2014-10-21 11:44:0954 void WebContentsDestroyed() override {
[email protected]7fff43e2013-05-21 20:21:1055 shell_->OnDevToolsWebContentsDestroyed();
56 }
57
58 private:
59 Shell* shell_;
60
61 DISALLOW_COPY_AND_ASSIGN(DevToolsWebContentsObserver);
62};
63
[email protected]0b659b32012-03-26 21:29:3264Shell::Shell(WebContents* web_contents)
[email protected]1ef02d242013-10-07 16:18:5365 : WebContentsObserver(web_contents),
66 devtools_frontend_(NULL),
[email protected]001841c92012-12-11 17:00:1367 is_fullscreen_(false),
[email protected]99c014c2012-11-27 12:03:4268 window_(NULL),
[email protected]86b36e672012-12-21 00:09:5169 url_edit_view_(NULL),
[email protected]86b36e672012-12-21 00:09:5170 headless_(false) {
avi83883c82014-12-23 00:08:4971 const base::CommandLine& command_line =
72 *base::CommandLine::ForCurrentProcess();
paulmeyerbcc6ad22015-02-11 21:51:5973 if (command_line.HasSwitch(switches::kRunLayoutTest))
[email protected]86b36e672012-12-21 00:09:5174 headless_ = true;
[email protected]9e00e6352012-07-30 17:05:1875 windows_.push_back(this);
76
77 if (!shell_created_callback_.is_null()) {
78 shell_created_callback_.Run(this);
79 shell_created_callback_.Reset();
80 }
[email protected]9fbd3f862011-09-20 23:31:3481}
82
83Shell::~Shell() {
84 PlatformCleanUp();
[email protected]e99ca5112011-09-26 17:22:5485
86 for (size_t i = 0; i < windows_.size(); ++i) {
87 if (windows_[i] == this) {
88 windows_.erase(windows_.begin() + i);
89 break;
90 }
91 }
[email protected]11a65b692012-03-30 11:29:1692
[email protected]b53adf452014-02-07 12:55:0893 if (windows_.empty() && quit_message_loop_) {
94 if (headless_)
95 PlatformExit();
skyostil95082a62015-06-05 19:53:0796 base::ThreadTaskRunnerHandle::Get()->PostTask(
ki.stfu800779242015-10-12 22:46:2697 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
[email protected]b53adf452014-02-07 12:55:0898 }
[email protected]9fbd3f862011-09-20 23:31:3499}
100
[email protected]c0d036d2013-05-07 12:50:50101Shell* Shell::CreateShell(WebContents* web_contents,
102 const gfx::Size& initial_size) {
[email protected]0b659b32012-03-26 21:29:32103 Shell* shell = new Shell(web_contents);
[email protected]c0d036d2013-05-07 12:50:50104 shell->PlatformCreateWindow(initial_size.width(), initial_size.height());
[email protected]3fd84032012-01-12 18:20:17105
[email protected]0b659b32012-03-26 21:29:32106 shell->web_contents_.reset(web_contents);
107 web_contents->SetDelegate(shell);
[email protected]3fd84032012-01-12 18:20:17108
[email protected]5cba3bf2012-01-14 02:40:35109 shell->PlatformSetContents();
[email protected]3fd84032012-01-12 18:20:17110
111 shell->PlatformResizeSubViews();
[email protected]1596efb2013-01-17 22:13:01112
avi83883c82014-12-23 00:08:49113 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
paulmeyerbcc6ad22015-02-11 21:51:59114 switches::kRunLayoutTest)) {
[email protected]1596efb2013-01-17 22:13:01115 web_contents->GetMutableRendererPrefs()->use_custom_colors = false;
116 web_contents->GetRenderViewHost()->SyncRendererPrefs();
117 }
118
guoweis8efb6d892015-10-12 18:26:17119#if defined(ENABLE_WEBRTC)
120 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
121 switches::kDisableWebRtcMultipleRoutes)) {
122 web_contents->GetMutableRendererPrefs()->enable_webrtc_multiple_routes =
123 false;
124 }
125#endif
126
[email protected]3fd84032012-01-12 18:20:17127 return shell;
128}
129
[email protected]11a65b692012-03-30 11:29:16130void Shell::CloseAllWindows() {
[email protected]997ec9f2012-11-21 04:44:14131 base::AutoReset<bool> auto_reset(&quit_message_loop_, false);
[email protected]b50452f2014-08-18 12:31:44132 DevToolsAgentHost::DetachAllClients();
[email protected]11a65b692012-03-30 11:29:16133 std::vector<Shell*> open_windows(windows_);
134 for (size_t i = 0; i < open_windows.size(); ++i)
135 open_windows[i]->Close();
[email protected]dd32b1272013-05-04 14:17:11136 base::MessageLoop::current()->RunUntilIdle();
dmazzoni948fbc72015-05-17 07:57:33137 PlatformExit();
[email protected]11a65b692012-03-30 11:29:16138}
139
[email protected]9e00e6352012-07-30 17:05:18140void Shell::SetShellCreatedCallback(
141 base::Callback<void(Shell*)> shell_created_callback) {
142 DCHECK(shell_created_callback_.is_null());
143 shell_created_callback_ = shell_created_callback;
144}
145
[email protected]74830f02012-01-30 22:27:04146Shell* Shell::FromRenderViewHost(RenderViewHost* rvh) {
147 for (size_t i = 0; i < windows_.size(); ++i) {
[email protected]0b659b32012-03-26 21:29:32148 if (windows_[i]->web_contents() &&
149 windows_[i]->web_contents()->GetRenderViewHost() == rvh) {
[email protected]74830f02012-01-30 22:27:04150 return windows_[i];
151 }
152 }
153 return NULL;
154}
155
[email protected]6153b272013-01-25 22:29:23156// static
157void Shell::Initialize() {
pdrcab84ee2015-03-13 21:47:04158 PlatformInitialize(GetShellDefaultSize());
[email protected]6153b272013-01-25 22:29:23159}
160
[email protected]a2904092013-10-15 04:53:59161gfx::Size Shell::AdjustWindowSize(const gfx::Size& initial_size) {
162 if (!initial_size.IsEmpty())
163 return initial_size;
pdrcab84ee2015-03-13 21:47:04164 return GetShellDefaultSize();
[email protected]a2904092013-10-15 04:53:59165}
166
[email protected]bdcf9152012-07-19 17:43:21167Shell* Shell::CreateNewWindow(BrowserContext* browser_context,
[email protected]e99ca5112011-09-26 17:22:54168 const GURL& url,
169 SiteInstance* site_instance,
[email protected]cdb806722013-01-10 14:18:23170 const gfx::Size& initial_size) {
[email protected]54944cde2012-12-09 09:24:59171 WebContents::CreateParams create_params(browser_context, site_instance);
[email protected]a2904092013-10-15 04:53:59172 create_params.initial_size = AdjustWindowSize(initial_size);
[email protected]54944cde2012-12-09 09:24:59173 WebContents* web_contents = WebContents::Create(create_params);
[email protected]c0d036d2013-05-07 12:50:50174 Shell* shell = CreateShell(web_contents, create_params.initial_size);
[email protected]e99ca5112011-09-26 17:22:54175 if (!url.is_empty())
176 shell->LoadURL(url);
[email protected]9fbd3f862011-09-20 23:31:34177 return shell;
178}
179
180void Shell::LoadURL(const GURL& url) {
[email protected]d2494ff2013-02-20 08:22:37181 LoadURLForFrame(url, std::string());
182}
183
184void Shell::LoadURLForFrame(const GURL& url, const std::string& frame_name) {
185 NavigationController::LoadURLParams params(url);
Sylvain Defresnec6ccc77d2014-09-19 10:19:35186 params.transition_type = ui::PageTransitionFromInt(
187 ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
[email protected]d2494ff2013-02-20 08:22:37188 params.frame_name = frame_name;
189 web_contents_->GetController().LoadURLWithParams(params);
[email protected]fc2b46b2014-05-03 16:33:45190 web_contents_->Focus();
[email protected]9fbd3f862011-09-20 23:31:34191}
192
[email protected]76bdecb2014-04-16 17:58:08193void Shell::LoadDataWithBaseURL(const GURL& url, const std::string& data,
194 const GURL& base_url) {
195 const GURL data_url = GURL("data:text/html;charset=utf-8," + data);
196 NavigationController::LoadURLParams params(data_url);
197 params.load_type = NavigationController::LOAD_TYPE_DATA;
198 params.base_url_for_data_url = base_url;
199 params.virtual_url_for_data_url = url;
200 params.override_user_agent = NavigationController::UA_OVERRIDE_FALSE;
201 web_contents_->GetController().LoadURLWithParams(params);
[email protected]fc2b46b2014-05-03 16:33:45202 web_contents_->Focus();
[email protected]76bdecb2014-04-16 17:58:08203}
204
[email protected]a2904092013-10-15 04:53:59205void Shell::AddNewContents(WebContents* source,
206 WebContents* new_contents,
207 WindowOpenDisposition disposition,
bokan107a47f2015-02-03 23:23:39208 const gfx::Rect& initial_rect,
[email protected]a2904092013-10-15 04:53:59209 bool user_gesture,
210 bool* was_blocked) {
bokan107a47f2015-02-03 23:23:39211 CreateShell(new_contents, AdjustWindowSize(initial_rect.size()));
avi83883c82014-12-23 00:08:49212 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
paulmeyerbcc6ad22015-02-11 21:51:59213 switches::kRunLayoutTest))
[email protected]a2904092013-10-15 04:53:59214 NotifyDoneForwarder::CreateForWebContents(new_contents);
215}
216
[email protected]9fbd3f862011-09-20 23:31:34217void Shell::GoBackOrForward(int offset) {
[email protected]0b659b32012-03-26 21:29:32218 web_contents_->GetController().GoToOffset(offset);
[email protected]fc2b46b2014-05-03 16:33:45219 web_contents_->Focus();
[email protected]9fbd3f862011-09-20 23:31:34220}
221
222void Shell::Reload() {
[email protected]0b659b32012-03-26 21:29:32223 web_contents_->GetController().Reload(false);
[email protected]fc2b46b2014-05-03 16:33:45224 web_contents_->Focus();
[email protected]9fbd3f862011-09-20 23:31:34225}
226
227void Shell::Stop() {
[email protected]0b659b32012-03-26 21:29:32228 web_contents_->Stop();
[email protected]fc2b46b2014-05-03 16:33:45229 web_contents_->Focus();
[email protected]9fbd3f862011-09-20 23:31:34230}
231
[email protected]e3b10d12014-03-28 16:06:09232void Shell::UpdateNavigationControls(bool to_different_document) {
[email protected]0b659b32012-03-26 21:29:32233 int current_index = web_contents_->GetController().GetCurrentEntryIndex();
234 int max_index = web_contents_->GetController().GetEntryCount() - 1;
[email protected]9fbd3f862011-09-20 23:31:34235
236 PlatformEnableUIControl(BACK_BUTTON, current_index > 0);
237 PlatformEnableUIControl(FORWARD_BUTTON, current_index < max_index);
[email protected]e3b10d12014-03-28 16:06:09238 PlatformEnableUIControl(STOP_BUTTON,
239 to_different_document && web_contents_->IsLoading());
[email protected]9fbd3f862011-09-20 23:31:34240}
241
[email protected]7c17b6992012-08-09 16:16:30242void Shell::ShowDevTools() {
pfeldman552756452015-02-03 17:33:06243 InnerShowDevTools();
[email protected]3142e5d2014-02-07 00:54:46244}
245
246void Shell::ShowDevToolsForElementAt(int x, int y) {
pfeldman552756452015-02-03 17:33:06247 InnerShowDevTools();
[email protected]2317fcd2014-02-10 14:36:48248 devtools_frontend_->InspectElementAt(x, y);
[email protected]7c17b6992012-08-09 16:16:30249}
250
[email protected]001841c92012-12-11 17:00:13251void Shell::CloseDevTools() {
[email protected]0773e0c2013-01-25 15:57:57252 if (!devtools_frontend_)
[email protected]001841c92012-12-11 17:00:13253 return;
[email protected]7fff43e2013-05-21 20:21:10254 devtools_observer_.reset();
[email protected]0773e0c2013-01-25 15:57:57255 devtools_frontend_->Close();
256 devtools_frontend_ = NULL;
[email protected]001841c92012-12-11 17:00:13257}
258
[email protected]9fbd3f862011-09-20 23:31:34259gfx::NativeView Shell::GetContentView() {
[email protected]59383c782013-04-17 16:43:27260 if (!web_contents_)
[email protected]9fbd3f862011-09-20 23:31:34261 return NULL;
[email protected]fc2b46b2014-05-03 16:33:45262 return web_contents_->GetNativeView();
[email protected]9fbd3f862011-09-20 23:31:34263}
264
[email protected]9e00e6352012-07-30 17:05:18265WebContents* Shell::OpenURLFromTab(WebContents* source,
266 const OpenURLParams& params) {
[email protected]7cf38302013-08-29 12:23:46267 // CURRENT_TAB is the only one we implement for now.
268 if (params.disposition != CURRENT_TAB)
269 return NULL;
[email protected]fbaccee2013-08-12 23:24:02270 NavigationController::LoadURLParams load_url_params(params.url);
lfg9ef7d2d2014-12-15 22:32:30271 load_url_params.source_site_instance = params.source_site_instance;
[email protected]fbaccee2013-08-12 23:24:02272 load_url_params.referrer = params.referrer;
[email protected]c80297782013-11-21 07:10:16273 load_url_params.frame_tree_node_id = params.frame_tree_node_id;
[email protected]fbaccee2013-08-12 23:24:02274 load_url_params.transition_type = params.transition;
275 load_url_params.extra_headers = params.extra_headers;
276 load_url_params.should_replace_current_entry =
277 params.should_replace_current_entry;
278
279 if (params.transferred_global_request_id != GlobalRequestID()) {
280 load_url_params.is_renderer_initiated = params.is_renderer_initiated;
281 load_url_params.transferred_global_request_id =
282 params.transferred_global_request_id;
283 } else if (params.is_renderer_initiated) {
284 load_url_params.is_renderer_initiated = true;
285 }
286
287 source->GetController().LoadURLWithParams(load_url_params);
[email protected]9e00e6352012-07-30 17:05:18288 return source;
289}
290
[email protected]e3b10d12014-03-28 16:06:09291void Shell::LoadingStateChanged(WebContents* source,
292 bool to_different_document) {
293 UpdateNavigationControls(to_different_document);
[email protected]15aea412012-01-19 03:18:50294 PlatformSetIsLoading(source->IsLoading());
[email protected]e99ca5112011-09-26 17:22:54295}
296
mlamouri7a78d6fd2015-01-17 13:23:53297void Shell::EnterFullscreenModeForTab(WebContents* web_contents,
298 const GURL& origin) {
299 ToggleFullscreenModeForTab(web_contents, true);
300}
301
302void Shell::ExitFullscreenModeForTab(WebContents* web_contents) {
303 ToggleFullscreenModeForTab(web_contents, false);
304}
305
[email protected]99c014c2012-11-27 12:03:42306void Shell::ToggleFullscreenModeForTab(WebContents* web_contents,
307 bool enter_fullscreen) {
308#if defined(OS_ANDROID)
309 PlatformToggleFullscreenModeForTab(web_contents, enter_fullscreen);
310#endif
avi83883c82014-12-23 00:08:49311 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
paulmeyerbcc6ad22015-02-11 21:51:59312 switches::kRunLayoutTest))
[email protected]99c014c2012-11-27 12:03:42313 return;
314 if (is_fullscreen_ != enter_fullscreen) {
315 is_fullscreen_ = enter_fullscreen;
316 web_contents->GetRenderViewHost()->WasResized();
317 }
318}
319
320bool Shell::IsFullscreenForTabOrPending(const WebContents* web_contents) const {
321#if defined(OS_ANDROID)
322 return PlatformIsFullscreenForTabOrPending(web_contents);
323#else
324 return is_fullscreen_;
325#endif
326}
327
mikhail.pozdnyakovc0e251b2015-04-15 06:51:12328blink::WebDisplayMode Shell::GetDisplayMode(
329 const WebContents* web_contents) const {
330 // TODO : should return blink::WebDisplayModeFullscreen wherever user puts
331 // a browser window into fullscreen (not only in case of renderer-initiated
332 // fullscreen mode): crbug.com/476874.
333 return IsFullscreenForTabOrPending(web_contents) ?
334 blink::WebDisplayModeFullscreen : blink::WebDisplayModeBrowser;
335}
336
[email protected]f78439002012-11-28 14:45:59337void Shell::RequestToLockMouse(WebContents* web_contents,
338 bool user_gesture,
339 bool last_unlocked_by_target) {
340 web_contents->GotResponseToLockMouseRequest(true);
341}
342
[email protected]9e00e6352012-07-30 17:05:18343void Shell::CloseContents(WebContents* source) {
344 Close();
345}
346
[email protected]067310262012-11-22 14:30:41347bool Shell::CanOverscrollContent() const {
348#if defined(USE_AURA)
349 return true;
350#else
351 return false;
352#endif
353}
354
[email protected]3bbacc5b2012-04-17 17:46:15355void Shell::DidNavigateMainFramePostCommit(WebContents* web_contents) {
[email protected]4e3c7522013-08-13 11:53:18356 PlatformSetAddressBarURL(web_contents->GetLastCommittedURL());
[email protected]e99ca5112011-09-26 17:22:54357}
358
mathiash72a5e462014-11-19 08:18:50359JavaScriptDialogManager* Shell::GetJavaScriptDialogManager(
360 WebContents* source) {
mkwst6efe7f2e62014-10-08 15:09:01361 if (!dialog_manager_) {
avi83883c82014-12-23 00:08:49362 const base::CommandLine& command_line =
363 *base::CommandLine::ForCurrentProcess();
paulmeyerbcc6ad22015-02-11 21:51:59364 dialog_manager_.reset(command_line.HasSwitch(switches::kRunLayoutTest)
mkwst6efe7f2e62014-10-08 15:09:01365 ? new LayoutTestJavaScriptDialogManager
366 : new ShellJavaScriptDialogManager);
367 }
[email protected]71a88bb2013-02-01 22:05:15368 return dialog_manager_.get();
[email protected]f2210022012-03-29 00:36:08369}
370
jyasskin8057c002015-09-10 19:09:53371scoped_ptr<BluetoothChooser> Shell::RunBluetoothChooser(
372 WebContents* web_contents,
373 const BluetoothChooser::EventHandler& event_handler,
374 const GURL& origin) {
375 const base::CommandLine& command_line =
376 *base::CommandLine::ForCurrentProcess();
377 if (command_line.HasSwitch(switches::kRunLayoutTest)) {
378 return BlinkTestController::Get()->RunBluetoothChooser(
379 web_contents, event_handler, origin);
380 }
381 return nullptr;
382}
383
[email protected]c272c5b2012-06-06 09:01:06384bool Shell::AddMessageToConsole(WebContents* source,
385 int32 level,
[email protected]fcf75d42013-12-03 20:11:26386 const base::string16& message,
[email protected]c272c5b2012-06-06 09:01:06387 int32 line_no,
[email protected]fcf75d42013-12-03 20:11:26388 const base::string16& source_id) {
avi83883c82014-12-23 00:08:49389 return base::CommandLine::ForCurrentProcess()->HasSwitch(
paulmeyerbcc6ad22015-02-11 21:51:59390 switches::kRunLayoutTest);
[email protected]efb5f572012-01-29 10:57:33391}
392
[email protected]5bf68f22012-08-31 07:38:10393void Shell::RendererUnresponsive(WebContents* source) {
avi83883c82014-12-23 00:08:49394 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
paulmeyerbcc6ad22015-02-11 21:51:59395 switches::kRunLayoutTest))
[email protected]5bf68f22012-08-31 07:38:10396 return;
tfarinacde91252015-05-06 16:10:49397 BlinkTestController::Get()->RendererUnresponsive();
[email protected]5bf68f22012-08-31 07:38:10398}
399
[email protected]233567d2013-02-27 20:22:02400void Shell::ActivateContents(WebContents* contents) {
401 contents->GetRenderViewHost()->Focus();
402}
403
404void Shell::DeactivateContents(WebContents* contents) {
405 contents->GetRenderViewHost()->Blur();
406}
407
[email protected]3142e5d2014-02-07 00:54:46408bool Shell::HandleContextMenu(const content::ContextMenuParams& params) {
409 return PlatformHandleContextMenu(params);
410}
411
pdrcab84ee2015-03-13 21:47:04412gfx::Size Shell::GetShellDefaultSize() {
413 static gfx::Size default_shell_size;
414 if (!default_shell_size.IsEmpty())
415 return default_shell_size;
416 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
417 if (command_line->HasSwitch(switches::kContentShellHostWindowSize)) {
418 const std::string size_str = command_line->GetSwitchValueASCII(
419 switches::kContentShellHostWindowSize);
420 int width, height;
421 CHECK_EQ(2, sscanf(size_str.c_str(), "%dx%d", &width, &height));
422 default_shell_size = gfx::Size(width, height);
423 } else {
424 default_shell_size = gfx::Size(
425 kDefaultTestWindowWidthDip, kDefaultTestWindowHeightDip);
426 }
427 return default_shell_size;
428}
429
[email protected]1ef02d242013-10-07 16:18:53430void Shell::TitleWasSet(NavigationEntry* entry, bool explicit_set) {
431 if (entry)
432 PlatformSetTitle(entry->GetTitle());
[email protected]aecc085b2012-06-01 18:15:53433}
434
pfeldman552756452015-02-03 17:33:06435void Shell::InnerShowDevTools() {
[email protected]fee9eca02014-02-14 19:24:40436 if (!devtools_frontend_) {
pfeldman552756452015-02-03 17:33:06437 devtools_frontend_ = ShellDevToolsFrontend::Show(web_contents());
[email protected]fee9eca02014-02-14 19:24:40438 devtools_observer_.reset(new DevToolsWebContentsObserver(
439 this, devtools_frontend_->frontend_shell()->web_contents()));
440 }
441
442 devtools_frontend_->Activate();
443 devtools_frontend_->Focus();
444}
445
[email protected]7fff43e2013-05-21 20:21:10446void Shell::OnDevToolsWebContentsDestroyed() {
447 devtools_observer_.reset();
448 devtools_frontend_ = NULL;
449}
450
[email protected]9fbd3f862011-09-20 23:31:34451} // namespace content