172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/background_contents.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/background_contents_service.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_message_service.h"
921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/renderer_preferences_util.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/chrome_web_ui_factory.h"
12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/extensions/extension_constants.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/extensions/extension_messages.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/view_types.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browsing_instance.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/site_instance.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/view_messages.h"
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// BackgroundContents
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBackgroundContents::BackgroundContents(SiteInstance* site_instance,
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                       int routing_id,
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                       Delegate* delegate)
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : delegate_(delegate) {
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile = site_instance->browsing_instance()->profile();
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(rafaelw): Implement correct session storage.
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  render_view_host_ = new RenderViewHost(site_instance, this, routing_id, NULL);
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close ourselves when the application is shutting down.
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::APP_TERMINATING,
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NotificationService::AllSources());
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Register for our parent profile to shutdown, so we can shut ourselves down
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // as well (should only be called for OTR profiles, as we should receive
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // APP_TERMINATING before non-OTR profiles are destroyed).
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::PROFILE_DESTROYED,
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 Source<Profile>(profile));
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Exposed to allow creating mocks.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBackgroundContents::BackgroundContents()
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : delegate_(NULL),
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      render_view_host_(NULL) {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBackgroundContents::~BackgroundContents() {
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!render_view_host_)   // Will be null for unit tests.
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile = render_view_host_->process()->profile();
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationService::current()->Notify(
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationType::BACKGROUND_CONTENTS_DELETED,
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Source<Profile>(profile),
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Details<BackgroundContents>(this));
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  render_view_host_->Shutdown();  // deletes render_view_host
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenBackgroundContents* BackgroundContents::GetAsBackgroundContents() {
6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return this;
6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenRenderViewHostDelegate::View* BackgroundContents::GetViewDelegate() {
6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return this;
6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst GURL& BackgroundContents::GetURL() const {
7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return url_;
7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
75731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickViewType::Type BackgroundContents::GetRenderViewType() const {
76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return ViewType::BACKGROUND_CONTENTS;
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickint BackgroundContents::GetBrowserWindowID() const {
80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return extension_misc::kUnknownWindowId;
81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundContents::DidNavigate(
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RenderViewHost* render_view_host,
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const ViewHostMsg_FrameNavigate_Params& params) {
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We only care when the outer frame changes.
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!PageTransition::IsMainFrame(params.transition))
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Note: because BackgroundContents are only available to extension apps,
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // navigation is limited to urls within the app's extent. This is enforced in
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // RenderView::decidePolicyForNaviation. If BackgroundContents become
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // available as a part of the web platform, it probably makes sense to have
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // some way to scope navigation of a background page to its opener's security
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // origin. Note: if the first navigation is to a URL outside the app's
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // extent a background page will be opened but will remain at about:blank.
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url_ = params.url;
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile = render_view_host->process()->profile();
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationService::current()->Notify(
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationType::BACKGROUND_CONTENTS_NAVIGATED,
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Source<Profile>(profile),
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Details<BackgroundContents>(this));
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundContents::RunJavaScriptMessage(
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::wstring& message,
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::wstring& default_prompt,
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GURL& frame_url,
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const int flags,
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    IPC::Message* reply_msg,
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool* did_suppress_message) {
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(rafaelw): Implement, The JavaScriptModalDialog needs to learn about
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BackgroundContents.
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *did_suppress_message = true;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool BackgroundContents::PreHandleKeyboardEvent(
119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const NativeWebKeyboardEvent& event,
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    bool* is_keyboard_shortcut) {
121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return false;
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid BackgroundContents::Observe(NotificationType type,
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                 const NotificationSource& source,
126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                 const NotificationDetails& details) {
127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TODO(rafaelw): Implement pagegroup ref-counting so that non-persistent
128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // background pages are closed when the last referencing frame is closed.
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  switch (type.value) {
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NotificationType::PROFILE_DESTROYED:
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    case NotificationType::APP_TERMINATING: {
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      delete this;
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    default:
136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NOTREACHED() << "Unexpected notification sent.";
137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      break;
138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundContents::OnMessageBoxClosed(IPC::Message* reply_msg,
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            bool success,
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            const std::wstring& prompt) {
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  render_view_host_->JavaScriptMessageBoxClosed(reply_msg, success, prompt);
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickgfx::NativeWindow BackgroundContents::GetMessageBoxRootWindow() {
148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NOTIMPLEMENTED();
149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return NULL;
150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
15221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTabContents* BackgroundContents::AsTabContents() {
15321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return NULL;
15421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
15521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
15621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenExtensionHost* BackgroundContents::AsExtensionHost() {
15721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return NULL;
15821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
15921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid BackgroundContents::UpdateInspectorSetting(const std::string& key,
161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                         const std::string& value) {
162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Profile* profile = render_view_host_->process()->profile();
163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RenderViewHostDelegateHelper::UpdateInspectorSetting(profile, key, value);
164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid BackgroundContents::ClearInspectorSettings() {
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Profile* profile = render_view_host_->process()->profile();
168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RenderViewHostDelegateHelper::ClearInspectorSettings(profile);
169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundContents::Close(RenderViewHost* render_view_host) {
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile = render_view_host->process()->profile();
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationService::current()->Notify(
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NotificationType::BACKGROUND_CONTENTS_CLOSED,
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Source<Profile>(profile),
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Details<BackgroundContents>(this));
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete this;
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid BackgroundContents::RenderViewGone(RenderViewHost* rvh,
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                        base::TerminationStatus status,
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                        int error_code) {
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Profile* profile = rvh->process()->profile();
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NotificationService::current()->Notify(
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NotificationType::BACKGROUND_CONTENTS_TERMINATED,
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Source<Profile>(profile),
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      Details<BackgroundContents>(this));
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Our RenderView went away, so we should go away also, so killing the process
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // via the TaskManager doesn't permanently leave a BackgroundContents hanging
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // around the system, blocking future instances from being created
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // (http://crbug.com/65189).
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delete this;
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochRendererPreferences BackgroundContents::GetRendererPrefs(
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Profile* profile) const {
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RendererPreferences preferences;
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  renderer_preferences_util::UpdateFromSystemSettings(&preferences, profile);
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return preferences;
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebPreferences BackgroundContents::GetWebkitPrefs() {
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(rafaelw): Consider enabling the webkit_prefs.dom_paste_enabled for
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // apps.
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile = render_view_host_->process()->profile();
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return RenderViewHostDelegateHelper::GetWebkitPrefs(profile,
208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                      false);  // is_web_ui
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid BackgroundContents::ProcessWebUIMessage(
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const ExtensionHostMsg_DomMessage_Params& params) {
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(rafaelw): It may make sense for extensions to be able to open
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BackgroundContents to chrome-extension://<id> pages. Consider implementing.
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  render_view_host_->Send(new ExtensionMsg_Response(
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      render_view_host_->routing_id(), params.request_id, false,
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      std::string(), "Access to extension API denied."));
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundContents::CreateNewWindow(
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int route_id,
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const ViewHostMsg_CreateWindow_Params& params) {
2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  delegate_view_helper_.CreateNewWindow(
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      route_id,
2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      render_view_host_->process()->profile(),
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      render_view_host_->site_instance(),
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ChromeWebUIFactory::GetInstance()->GetWebUIType(
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          render_view_host_->process()->profile(), url_),
2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      this,
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      params.window_container_type,
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      params.frame_name);
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundContents::CreateNewWidget(int route_id,
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         WebKit::WebPopupType popup_type) {
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NOTREACHED();
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid BackgroundContents::CreateNewFullscreenWidget(int route_id) {
2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NOTREACHED();
2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundContents::ShowCreatedWindow(int route_id,
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           WindowOpenDisposition disposition,
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           const gfx::Rect& initial_pos,
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           bool user_gesture) {
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* contents = delegate_view_helper_.GetCreatedWindow(route_id);
2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (contents)
2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    delegate_->AddTabContents(contents, disposition, initial_pos, user_gesture);
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackgroundContents::ShowCreatedWidget(int route_id,
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           const gfx::Rect& initial_pos) {
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NOTIMPLEMENTED();
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackgroundContents::ShowCreatedFullscreenWidget(int route_id) {
2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NOTIMPLEMENTED();
2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// static
2624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochBackgroundContents*
2634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochBackgroundContents::GetBackgroundContentsByID(int render_process_id,
2644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                              int render_view_id) {
2654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  RenderViewHost* render_view_host =
2664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      RenderViewHost::FromID(render_process_id, render_view_id);
2674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (!render_view_host)
2684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return NULL;
2694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return render_view_host->delegate()->GetAsBackgroundContents();
2714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
272