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