shell.cc revision 3551c9c881056c480085172ff9840cab31610854
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/notification_details.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_view.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/renderer_preferences.h" 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/notify_done_forwarder.h" 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_browser_main_parts.h" 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_content_browser_client.h" 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_devtools_frontend.h" 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_javascript_dialog_manager.h" 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/webkit_test_controller.h" 32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_messages.h" 33b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_switches.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int Shell::kDefaultTestWindowWidthDip = 800; 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int Shell::kDefaultTestWindowHeightDip = 600; 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<Shell*> Shell::windows_; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Callback<void(Shell*)> Shell::shell_created_callback_; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Shell::quit_message_loop_ = true; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Shell::DevToolsWebContentsObserver : public WebContentsObserver { 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DevToolsWebContentsObserver(Shell* shell, WebContents* web_contents) 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : WebContentsObserver(web_contents), 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) shell_(shell) { 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // WebContentsObserver 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void WebContentsDestroyed(WebContents* web_contents) OVERRIDE { 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) shell_->OnDevToolsWebContentsDestroyed(); 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Shell* shell_; 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DevToolsWebContentsObserver); 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell::Shell(WebContents* web_contents) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : devtools_frontend_(NULL), 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_fullscreen_(false), 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_(NULL), 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_edit_view_(NULL), 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default_edit_wnd_proc_(0), 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) headless_(false) { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (command_line.HasSwitch(switches::kDumpRenderTree)) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) headless_ = true; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(web_contents)); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_.push_back(this); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!shell_created_callback_.is_null()) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_created_callback_.Run(this); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_created_callback_.Reset(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell::~Shell() { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformCleanUp(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < windows_.size(); ++i) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (windows_[i] == this) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_.erase(windows_.begin() + i); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (windows_.empty() && quit_message_loop_) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::QuitClosure()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)Shell* Shell::CreateShell(WebContents* web_contents, 101b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const gfx::Size& initial_size) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell* shell = new Shell(web_contents); 103b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) shell->PlatformCreateWindow(initial_size.width(), initial_size.height()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->web_contents_.reset(web_contents); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents->SetDelegate(shell); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->PlatformSetContents(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->PlatformResizeSubViews(); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) { 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetMutableRendererPrefs()->use_custom_colors = false; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost()->SyncRendererPrefs(); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shell; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::CloseAllWindows() { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoReset<bool> auto_reset(&quit_message_loop_, false); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DevToolsManager::GetInstance()->CloseAllClientHosts(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Shell*> open_windows(windows_); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < open_windows.size(); ++i) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) open_windows[i]->Close(); 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::SetShellCreatedCallback( 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<void(Shell*)> shell_created_callback) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(shell_created_callback_.is_null()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell_created_callback_ = shell_created_callback; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* Shell::FromRenderViewHost(RenderViewHost* rvh) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < windows_.size(); ++i) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (windows_[i]->web_contents() && 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_[i]->web_contents()->GetRenderViewHost() == rvh) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return windows_[i]; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::Initialize() { 14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PlatformInitialize( 14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size(kDefaultTestWindowWidthDip, kDefaultTestWindowHeightDip)); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* Shell::CreateNewWindow(BrowserContext* browser_context, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* site_instance, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int routing_id, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& initial_size) { 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents::CreateParams create_params(browser_context, site_instance); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.routing_id = routing_id; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!initial_size.IsEmpty()) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) create_params.initial_size = initial_size; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) create_params.initial_size = 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Size(kDefaultTestWindowWidthDip, kDefaultTestWindowHeightDip); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents = WebContents::Create(create_params); 164b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) Shell* shell = CreateShell(web_contents, create_params.initial_size); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_empty()) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shell->LoadURL(url); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shell; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::LoadURL(const GURL& url) { 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadURLForFrame(url, std::string()); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::LoadURLForFrame(const GURL& url, const std::string& frame_name) { 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationController::LoadURLParams params(url); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.transition_type = PageTransitionFromInt( 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PAGE_TRANSITION_TYPED | PAGE_TRANSITION_FROM_ADDRESS_BAR); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.frame_name = frame_name; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetController().LoadURLWithParams(params); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetView()->Focus(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::GoBackOrForward(int offset) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetController().GoToOffset(offset); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetView()->Focus(); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::Reload() { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetController().Reload(false); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetView()->Focus(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::Stop() { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->Stop(); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetView()->Focus(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::UpdateNavigationControls() { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int current_index = web_contents_->GetController().GetCurrentEntryIndex(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_index = web_contents_->GetController().GetEntryCount() - 1; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformEnableUIControl(BACK_BUTTON, current_index > 0); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformEnableUIControl(FORWARD_BUTTON, current_index < max_index); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformEnableUIControl(STOP_BUTTON, web_contents_->IsLoading()); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::ShowDevTools() { 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (devtools_frontend_) { 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) devtools_frontend_->Focus(); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) devtools_frontend_ = ShellDevToolsFrontend::Show(web_contents()); 21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) devtools_observer_.reset(new DevToolsWebContentsObserver( 21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this, devtools_frontend_->frontend_shell()->web_contents())); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::CloseDevTools() { 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!devtools_frontend_) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) devtools_observer_.reset(); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) devtools_frontend_->Close(); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) devtools_frontend_ = NULL; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView Shell::GetContentView() { 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!web_contents_) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return web_contents_->GetView()->GetNativeView(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* Shell::OpenURLFromTab(WebContents* source, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const OpenURLParams& params) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The only one we implement for now. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(params.disposition == CURRENT_TAB); 235c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch NavigationController::LoadURLParams load_url_params(params.url); 236c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.referrer = params.referrer; 237c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.transition_type = params.transition; 238c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.extra_headers = params.extra_headers; 239c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.should_replace_current_entry = 240c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch params.should_replace_current_entry; 241c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 242c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch if (params.transferred_global_request_id != GlobalRequestID()) { 243c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.is_renderer_initiated = params.is_renderer_initiated; 244c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.transferred_global_request_id = 245c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch params.transferred_global_request_id; 246c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } else if (params.is_renderer_initiated) { 247c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch load_url_params.is_renderer_initiated = true; 248c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 249c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 250c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch source->GetController().LoadURLWithParams(load_url_params); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return source; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::LoadingStateChanged(WebContents* source) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateNavigationControls(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformSetIsLoading(source->IsLoading()); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::ToggleFullscreenModeForTab(WebContents* web_contents, 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool enter_fullscreen) { 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PlatformToggleFullscreenModeForTab(web_contents, enter_fullscreen); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_fullscreen_ != enter_fullscreen) { 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_fullscreen_ = enter_fullscreen; 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost()->WasResized(); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Shell::IsFullscreenForTabOrPending(const WebContents* web_contents) const { 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PlatformIsFullscreenForTabOrPending(web_contents); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return is_fullscreen_; 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::RequestToLockMouse(WebContents* web_contents, 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool user_gesture, 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool last_unlocked_by_target) { 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GotResponseToLockMouseRequest(true); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::CloseContents(WebContents* source) { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Close(); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Shell::CanOverscrollContent() const { 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::WebContentsCreated(WebContents* source_contents, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 source_frame_id, 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const string16& frame_name, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& target_url, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_contents) { 303b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) CreateShell(new_contents, source_contents->GetView()->GetContainerSize()); 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotifyDoneForwarder::CreateForWebContents(new_contents); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (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 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::Observe(int type, 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationSource& source, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationDetails& details) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED) { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<NavigationEntry*, bool>* title = 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Details<std::pair<NavigationEntry*, bool> >(details).ptr(); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (title->first) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 text = title->first->GetTitle(); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PlatformSetTitle(text); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void Shell::OnDevToolsWebContentsDestroyed() { 36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) devtools_observer_.reset(); 36490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) devtools_frontend_ = NULL; 36590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 36690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 368