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