shell.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/auto_reset.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/devtools_manager.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 17b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/public/browser/navigation_entry.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_view.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/renderer_preferences.h" 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/notify_done_forwarder.h" 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_browser_main_parts.h" 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_content_browser_client.h" 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_devtools_frontend.h" 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_javascript_dialog_manager.h" 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/webkit_test_controller.h" 29b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_messages.h" 30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_switches.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int Shell::kDefaultTestWindowWidthDip = 800; 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int Shell::kDefaultTestWindowHeightDip = 600; 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<Shell*> Shell::windows_; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Callback<void(Shell*)> Shell::shell_created_callback_; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Shell::quit_message_loop_ = true; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Shell::DevToolsWebContentsObserver : public WebContentsObserver { 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DevToolsWebContentsObserver(Shell* shell, WebContents* web_contents) 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : WebContentsObserver(web_contents), 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) shell_(shell) { 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // WebContentsObserver 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void WebContentsDestroyed(WebContents* web_contents) OVERRIDE { 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) shell_->OnDevToolsWebContentsDestroyed(); 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Shell* shell_; 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DevToolsWebContentsObserver); 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell::Shell(WebContents* web_contents) 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : WebContentsObserver(web_contents), 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) devtools_frontend_(NULL), 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_fullscreen_(false), 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_(NULL), 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_edit_view_(NULL), 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) headless_(false) { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (command_line.HasSwitch(switches::kDumpRenderTree)) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) headless_ = true; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_.push_back(this); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!shell_created_callback_.is_null()) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_created_callback_.Run(this); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_created_callback_.Reset(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell::~Shell() { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformCleanUp(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < windows_.size(); ++i) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (windows_[i] == this) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_.erase(windows_.begin() + i); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (windows_.empty() && quit_message_loop_) { 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (headless_) 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PlatformExit(); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::QuitClosure()); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)Shell* Shell::CreateShell(WebContents* web_contents, 97b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const gfx::Size& initial_size) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell* shell = new Shell(web_contents); 99b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) shell->PlatformCreateWindow(initial_size.width(), initial_size.height()); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->web_contents_.reset(web_contents); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents->SetDelegate(shell); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->PlatformSetContents(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->PlatformResizeSubViews(); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetMutableRendererPrefs()->use_custom_colors = false; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost()->SyncRendererPrefs(); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shell; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::CloseAllWindows() { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoReset<bool> auto_reset(&quit_message_loop_, false); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DevToolsManager::GetInstance()->CloseAllClientHosts(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Shell*> open_windows(windows_); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < open_windows.size(); ++i) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) open_windows[i]->Close(); 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PlatformExit(); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::SetShellCreatedCallback( 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<void(Shell*)> shell_created_callback) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(shell_created_callback_.is_null()); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_created_callback_ = shell_created_callback; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* Shell::FromRenderViewHost(RenderViewHost* rvh) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < windows_.size(); ++i) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (windows_[i]->web_contents() && 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_[i]->web_contents()->GetRenderViewHost() == rvh) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return windows_[i]; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::Initialize() { 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PlatformInitialize( 14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size(kDefaultTestWindowWidthDip, kDefaultTestWindowHeightDip)); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)gfx::Size Shell::AdjustWindowSize(const gfx::Size& initial_size) { 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!initial_size.IsEmpty()) 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return initial_size; 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return gfx::Size(kDefaultTestWindowWidthDip, kDefaultTestWindowHeightDip); 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* Shell::CreateNewWindow(BrowserContext* browser_context, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& initial_size) { 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents::CreateParams create_params(browser_context, site_instance); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.routing_id = routing_id; 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) create_params.initial_size = AdjustWindowSize(initial_size); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = WebContents::Create(create_params); 163b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) Shell* shell = CreateShell(web_contents, create_params.initial_size); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_empty()) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->LoadURL(url); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shell; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::LoadURL(const GURL& url) { 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadURLForFrame(url, std::string()); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::LoadURLForFrame(const GURL& url, const std::string& frame_name) { 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationController::LoadURLParams params(url); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.transition_type = PageTransitionFromInt( 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PAGE_TRANSITION_TYPED | PAGE_TRANSITION_FROM_ADDRESS_BAR); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.frame_name = frame_name; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetController().LoadURLWithParams(params); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetView()->Focus(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Shell::AddNewContents(WebContents* source, 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebContents* new_contents, 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WindowOpenDisposition disposition, 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const gfx::Rect& initial_pos, 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool user_gesture, 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool* was_blocked) { 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateShell(new_contents, AdjustWindowSize(initial_pos.size())); 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NotifyDoneForwarder::CreateForWebContents(new_contents); 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::GoBackOrForward(int offset) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetController().GoToOffset(offset); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetView()->Focus(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::Reload() { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetController().Reload(false); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetView()->Focus(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::Stop() { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->Stop(); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetView()->Focus(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid Shell::UpdateNavigationControls(bool to_different_document) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int current_index = web_contents_->GetController().GetCurrentEntryIndex(); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_index = web_contents_->GetController().GetEntryCount() - 1; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformEnableUIControl(BACK_BUTTON, current_index > 0); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformEnableUIControl(FORWARD_BUTTON, current_index < max_index); 214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PlatformEnableUIControl(STOP_BUTTON, 215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch to_different_document && web_contents_->IsLoading()); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::ShowDevTools() { 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InnerShowDevTools(""); 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Shell::ShowDevToolsForElementAt(int x, int y) { 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InnerShowDevTools(""); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) devtools_frontend_->InspectElementAt(x, y); 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Shell::ShowDevToolsForTest(const std::string& settings) { 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InnerShowDevTools(settings); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::CloseDevTools() { 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!devtools_frontend_) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) devtools_observer_.reset(); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) devtools_frontend_->Close(); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) devtools_frontend_ = NULL; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView Shell::GetContentView() { 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!web_contents_) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return web_contents_->GetView()->GetNativeView(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* Shell::OpenURLFromTab(WebContents* source, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const OpenURLParams& params) { 247424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // CURRENT_TAB is the only one we implement for now. 248424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (params.disposition != CURRENT_TAB) 249424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return NULL; 250c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch NavigationController::LoadURLParams load_url_params(params.url); 251c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.referrer = params.referrer; 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) load_url_params.frame_tree_node_id = params.frame_tree_node_id; 253c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.transition_type = params.transition; 254c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.extra_headers = params.extra_headers; 255c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.should_replace_current_entry = 256c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch params.should_replace_current_entry; 257c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 258c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch if (params.transferred_global_request_id != GlobalRequestID()) { 259c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.is_renderer_initiated = params.is_renderer_initiated; 260c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.transferred_global_request_id = 261c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch params.transferred_global_request_id; 262c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } else if (params.is_renderer_initiated) { 263c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.is_renderer_initiated = true; 264c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 265c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 266c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch source->GetController().LoadURLWithParams(load_url_params); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return source; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid Shell::LoadingStateChanged(WebContents* source, 271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool to_different_document) { 272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch UpdateNavigationControls(to_different_document); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformSetIsLoading(source->IsLoading()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::ToggleFullscreenModeForTab(WebContents* web_contents, 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool enter_fullscreen) { 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PlatformToggleFullscreenModeForTab(web_contents, enter_fullscreen); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_fullscreen_ != enter_fullscreen) { 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_fullscreen_ = enter_fullscreen; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost()->WasResized(); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Shell::IsFullscreenForTabOrPending(const WebContents* web_contents) const { 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PlatformIsFullscreenForTabOrPending(web_contents); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return is_fullscreen_; 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::RequestToLockMouse(WebContents* web_contents, 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool user_gesture, 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool last_unlocked_by_target) { 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GotResponseToLockMouseRequest(true); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::CloseContents(WebContents* source) { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Shell::CanOverscrollContent() const { 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::DidNavigateMainFramePostCommit(WebContents* web_contents) { 3163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PlatformSetAddressBarURL(web_contents->GetLastCommittedURL()); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)JavaScriptDialogManager* Shell::GetJavaScriptDialogManager() { 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!dialog_manager_) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_.reset(new ShellJavaScriptDialogManager()); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return dialog_manager_.get(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Shell::AddMessageToConsole(WebContents* source, 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 level, 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& message, 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 line_no, 329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& source_id) { 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::RendererUnresponsive(WebContents* source) { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKitTestController::Get()->RendererUnresponsive(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::ActivateContents(WebContents* contents) { 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents->GetRenderViewHost()->Focus(); 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::DeactivateContents(WebContents* contents) { 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents->GetRenderViewHost()->Blur(); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 347a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid Shell::WorkerCrashed(WebContents* source) { 348a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 349a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return; 350a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch WebKitTestController::Get()->WorkerCrashed(); 351a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 352a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Shell::HandleContextMenu(const content::ContextMenuParams& params) { 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PlatformHandleContextMenu(params); 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Shell::WebContentsFocused(WebContents* contents) { 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(TOOLKIT_VIEWS) 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PlatformWebContentsFocused(contents); 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Shell::TitleWasSet(NavigationEntry* entry, bool explicit_set) { 3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (entry) 3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PlatformSetTitle(entry->GetTitle()); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Shell::InnerShowDevTools(const std::string& settings) { 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!devtools_frontend_) { 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) devtools_frontend_ = ShellDevToolsFrontend::Show(web_contents(), settings); 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) devtools_observer_.reset(new DevToolsWebContentsObserver( 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, devtools_frontend_->frontend_shell()->web_contents())); 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) devtools_frontend_->Activate(); 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) devtools_frontend_->Focus(); 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 37990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void Shell::OnDevToolsWebContentsDestroyed() { 38090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) devtools_observer_.reset(); 38190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) devtools_frontend_ = NULL; 38290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 38390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 385