shell.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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), 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_edit_wnd_proc_(0), 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) headless_(false) { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (command_line.HasSwitch(switches::kDumpRenderTree)) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) headless_ = true; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_.push_back(this); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!shell_created_callback_.is_null()) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_created_callback_.Run(this); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_created_callback_.Reset(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell::~Shell() { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformCleanUp(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < windows_.size(); ++i) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (windows_[i] == this) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_.erase(windows_.begin() + i); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (windows_.empty() && quit_message_loop_) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::QuitClosure()); 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(); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::SetShellCreatedCallback( 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<void(Shell*)> shell_created_callback) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(shell_created_callback_.is_null()); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_created_callback_ = shell_created_callback; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* Shell::FromRenderViewHost(RenderViewHost* rvh) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < windows_.size(); ++i) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (windows_[i]->web_contents() && 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_[i]->web_contents()->GetRenderViewHost() == rvh) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return windows_[i]; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::Initialize() { 14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PlatformInitialize( 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size(kDefaultTestWindowWidthDip, kDefaultTestWindowHeightDip)); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)gfx::Size Shell::AdjustWindowSize(const gfx::Size& initial_size) { 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!initial_size.IsEmpty()) 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return initial_size; 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return gfx::Size(kDefaultTestWindowWidthDip, kDefaultTestWindowHeightDip); 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* Shell::CreateNewWindow(BrowserContext* browser_context, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id, 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& initial_size) { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents::CreateParams create_params(browser_context, site_instance); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.routing_id = routing_id; 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) create_params.initial_size = AdjustWindowSize(initial_size); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = WebContents::Create(create_params); 162b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) Shell* shell = CreateShell(web_contents, create_params.initial_size); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_empty()) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->LoadURL(url); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shell; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::LoadURL(const GURL& url) { 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadURLForFrame(url, std::string()); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::LoadURLForFrame(const GURL& url, const std::string& frame_name) { 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationController::LoadURLParams params(url); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.transition_type = PageTransitionFromInt( 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PAGE_TRANSITION_TYPED | PAGE_TRANSITION_FROM_ADDRESS_BAR); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.frame_name = frame_name; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetController().LoadURLWithParams(params); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetView()->Focus(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Shell::AddNewContents(WebContents* source, 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebContents* new_contents, 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WindowOpenDisposition disposition, 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const gfx::Rect& initial_pos, 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool user_gesture, 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool* was_blocked) { 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateShell(new_contents, AdjustWindowSize(initial_pos.size())); 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NotifyDoneForwarder::CreateForWebContents(new_contents); 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::GoBackOrForward(int offset) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetController().GoToOffset(offset); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetView()->Focus(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::Reload() { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetController().Reload(false); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetView()->Focus(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::Stop() { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->Stop(); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetView()->Focus(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::UpdateNavigationControls() { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int current_index = web_contents_->GetController().GetCurrentEntryIndex(); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_index = web_contents_->GetController().GetEntryCount() - 1; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformEnableUIControl(BACK_BUTTON, current_index > 0); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformEnableUIControl(FORWARD_BUTTON, current_index < max_index); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformEnableUIControl(STOP_BUTTON, web_contents_->IsLoading()); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::ShowDevTools() { 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (devtools_frontend_) { 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) devtools_frontend_->Focus(); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) devtools_frontend_ = ShellDevToolsFrontend::Show(web_contents()); 22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) devtools_observer_.reset(new DevToolsWebContentsObserver( 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this, devtools_frontend_->frontend_shell()->web_contents())); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::CloseDevTools() { 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!devtools_frontend_) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) devtools_observer_.reset(); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) devtools_frontend_->Close(); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) devtools_frontend_ = NULL; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView Shell::GetContentView() { 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!web_contents_) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return web_contents_->GetView()->GetNativeView(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* Shell::OpenURLFromTab(WebContents* source, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const OpenURLParams& params) { 242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // CURRENT_TAB is the only one we implement for now. 243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (params.disposition != CURRENT_TAB) 244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return NULL; 245c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch NavigationController::LoadURLParams load_url_params(params.url); 246c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.referrer = params.referrer; 247c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.transition_type = params.transition; 248c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.extra_headers = params.extra_headers; 249c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.should_replace_current_entry = 250c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch params.should_replace_current_entry; 251c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 252c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch if (params.transferred_global_request_id != GlobalRequestID()) { 253c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.is_renderer_initiated = params.is_renderer_initiated; 254c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.transferred_global_request_id = 255c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch params.transferred_global_request_id; 256c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } else if (params.is_renderer_initiated) { 257c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.is_renderer_initiated = true; 258c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 259c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 260c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch source->GetController().LoadURLWithParams(load_url_params); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return source; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::LoadingStateChanged(WebContents* source) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateNavigationControls(); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformSetIsLoading(source->IsLoading()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::ToggleFullscreenModeForTab(WebContents* web_contents, 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool enter_fullscreen) { 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PlatformToggleFullscreenModeForTab(web_contents, enter_fullscreen); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_fullscreen_ != enter_fullscreen) { 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_fullscreen_ = enter_fullscreen; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost()->WasResized(); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Shell::IsFullscreenForTabOrPending(const WebContents* web_contents) const { 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PlatformIsFullscreenForTabOrPending(web_contents); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return is_fullscreen_; 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::RequestToLockMouse(WebContents* web_contents, 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool user_gesture, 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool last_unlocked_by_target) { 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GotResponseToLockMouseRequest(true); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::CloseContents(WebContents* source) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Shell::CanOverscrollContent() const { 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::DidNavigateMainFramePostCommit(WebContents* web_contents) { 3093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PlatformSetAddressBarURL(web_contents->GetLastCommittedURL()); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)JavaScriptDialogManager* Shell::GetJavaScriptDialogManager() { 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!dialog_manager_) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dialog_manager_.reset(new ShellJavaScriptDialogManager()); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return dialog_manager_.get(); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Shell::AddMessageToConsole(WebContents* source, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 level, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& message, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 line_no, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& source_id) { 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::RendererUnresponsive(WebContents* source) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKitTestController::Get()->RendererUnresponsive(); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::ActivateContents(WebContents* contents) { 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents->GetRenderViewHost()->Focus(); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::DeactivateContents(WebContents* contents) { 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents->GetRenderViewHost()->Blur(); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 340a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid Shell::WorkerCrashed(WebContents* source) { 341a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 342a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return; 343a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch WebKitTestController::Get()->WorkerCrashed(); 344a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 345a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Shell::TitleWasSet(NavigationEntry* entry, bool explicit_set) { 3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (entry) 3484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PlatformSetTitle(entry->GetTitle()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void Shell::OnDevToolsWebContentsDestroyed() { 35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) devtools_observer_.reset(); 35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) devtools_frontend_ = NULL; 35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 357