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#ifndef CHROME_BROWSER_TAB_CONTENTS_BACKGROUND_CONTENTS_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_TAB_CONTENTS_BACKGROUND_CONTENTS_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <vector>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/scoped_ptr.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/render_view_host_delegate_helper.h"
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/js_modal_dialog.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/view_types.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host_delegate.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/window_container_type.h"
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "webkit/glue/window_open_disposition.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabContents;
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstruct ExtensionHostMsg_DomMessage_Params;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct WebPreferences;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace gfx {
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass Rect;
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class is a peer of TabContents. It can host a renderer, but does not
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// have any visible display. Its navigation is not managed by a
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NavigationController because is has no facility for navigating (other than
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// programatically view window.location.href) or RenderViewHostManager because
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// it is never allowed to navigate across a SiteInstance boundary.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BackgroundContents : public RenderViewHostDelegate,
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           public RenderViewHostDelegate::View,
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           public NotificationObserver,
37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                           public JavaScriptAppModalDialogDelegate {
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  class Delegate {
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick   public:
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Called by ShowCreatedWindow. Asks the delegate to attach the opened
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // TabContents to a suitable container (e.g. browser) or to show it if it's
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // a popup window.
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    virtual void AddTabContents(TabContents* new_contents,
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                WindowOpenDisposition disposition,
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                const gfx::Rect& initial_pos,
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                bool user_gesture) = 0;
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick   protected:
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    virtual ~Delegate() {}
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackgroundContents(SiteInstance* site_instance,
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                     int routing_id,
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                     Delegate* delegate);
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~BackgroundContents();
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Provide access to the RenderViewHost for the
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // RenderViewHostDelegateViewHelper
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RenderViewHost* render_view_host() { return render_view_host_; }
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // RenderViewHostDelegate implementation.
6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual BackgroundContents* GetAsBackgroundContents();
6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual RenderViewHostDelegate::View* GetViewDelegate();
6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual const GURL& GetURL() const;
66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual ViewType::Type GetRenderViewType() const;
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual int GetBrowserWindowID() const;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DidNavigate(RenderViewHost* render_view_host,
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           const ViewHostMsg_FrameNavigate_Params& params);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual WebPreferences GetWebkitPrefs();
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ProcessWebUIMessage(
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const ExtensionHostMsg_DomMessage_Params& params);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void RunJavaScriptMessage(const std::wstring& message,
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    const std::wstring& default_prompt,
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    const GURL& frame_url,
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    const int flags,
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    IPC::Message* reply_msg,
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    bool* did_suppress_message);
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Close(RenderViewHost* render_view_host);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual RendererPreferences GetRendererPrefs(Profile* profile) const;
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void RenderViewGone(RenderViewHost* rvh,
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              base::TerminationStatus status,
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                              int error_code);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // RenderViewHostDelegate::View
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CreateNewWindow(
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int route_id,
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const ViewHostMsg_CreateWindow_Params& params);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CreateNewWidget(int route_id, WebKit::WebPopupType popup_type);
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void CreateNewFullscreenWidget(int route_id);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ShowCreatedWindow(int route_id,
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 WindowOpenDisposition disposition,
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const gfx::Rect& initial_pos,
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 bool user_gesture);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ShowCreatedWidget(int route_id,
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const gfx::Rect& initial_pos);
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void ShowCreatedFullscreenWidget(int route_id);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ShowContextMenu(const ContextMenuParams& params) {}
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void ShowPopupMenu(const gfx::Rect& bounds,
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             int item_height,
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             double item_font_size,
102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             int selected_item,
103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             const std::vector<WebMenuItem>& items,
104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             bool right_aligned) {}
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void StartDragging(const WebDropData& drop_data,
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             WebKit::WebDragOperationsMask allowed_operations,
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             const SkBitmap& image,
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             const gfx::Point& image_offset) {}
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void UpdateDragCursor(WebKit::WebDragOperation operation) {}
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void GotFocus() {}
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TakeFocus(bool reverse) {}
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void LostCapture() {}
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void Activate() {}
1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void Deactivate() {}
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                      bool* is_keyboard_shortcut);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {}
1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void HandleMouseMove() {}
1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void HandleMouseDown() {}
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void HandleMouseLeave() {}
1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void HandleMouseUp() {}
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void HandleMouseActivate() {}
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void UpdatePreferredSize(const gfx::Size& new_size) {}
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NotificationObserver
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Overridden from JavaScriptAppModalDialogDelegate:
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnMessageBoxClosed(IPC::Message* reply_msg,
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  bool success,
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  const std::wstring& prompt);
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetSuppressMessageBoxes(bool suppress_message_boxes) {}
135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual gfx::NativeWindow GetMessageBoxRootWindow();
13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual TabContents* AsTabContents();
13721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual ExtensionHost* AsExtensionHost();
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void UpdateInspectorSetting(const std::string& key,
140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                      const std::string& value);
141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void ClearInspectorSettings();
142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
1434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Helper to find the BackgroundContents that originated the given request.
1444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Can be NULL if the page has been closed or some other error occurs.
1454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Should only be called from the UI thread, since it accesses
1464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // BackgroundContents.
1474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static BackgroundContents* GetBackgroundContentsByID(int render_process_id,
1484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                                       int render_view_id);
1494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Exposed for testing.
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackgroundContents();
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The delegate for this BackgroundContents.
1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Delegate* delegate_;
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The host for our HTML content.
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RenderViewHost* render_view_host_;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Common implementations of some RenderViewHostDelegate::View methods.
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RenderViewHostDelegateViewHelper delegate_view_helper_;
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The URL being hosted.
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url_;
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(BackgroundContents);
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This is the data sent out as the details with BACKGROUND_CONTENTS_OPENED.
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct BackgroundContentsOpenedDetails {
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The BackgroundContents object that has just been opened.
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackgroundContents* contents;
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The name of the parent frame for these contents.
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const string16& frame_name;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The ID of the parent application (if any).
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const string16& application_id;
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_TAB_CONTENTS_BACKGROUND_CONTENTS_H_
185