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