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_NOTIFICATIONS_BALLOON_HOST_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_NOTIFICATIONS_BALLOON_HOST_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/extensions/extension_function_dispatcher.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/render_view_host_delegate_helper.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host_delegate.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass Balloon;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Browser;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass SiteInstance;
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstruct RendererPreferences;
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstruct WebPreferences;
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BalloonHost : public RenderViewHostDelegate,
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    public RenderViewHostDelegate::View,
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    public ExtensionFunctionDispatcher::Delegate,
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    public NotificationObserver {
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit BalloonHost(Balloon* balloon);
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Initialize the view.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Init();
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Stops showing the balloon.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Shutdown();
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ExtensionFunctionDispatcher::Delegate overrides.
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual Browser* GetBrowser();
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual gfx::NativeView GetNativeViewOfHost();
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual TabContents* associated_tab_contents() const;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RenderViewHost* render_view_host() const { return render_view_host_; }
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const string16& GetSource() const;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // RenderViewHostDelegate overrides.
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual WebPreferences GetWebkitPrefs();
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual SiteInstance* GetSiteInstance() const;
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual Profile* GetProfile() const;
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual const GURL& GetURL() const;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Close(RenderViewHost* render_view_host);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void RenderViewCreated(RenderViewHost* render_view_host);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void RenderViewReady(RenderViewHost* render_view_host);
5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void RenderViewGone(RenderViewHost* render_view_host,
5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                              base::TerminationStatus status,
5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                              int error_code);
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void UpdateTitle(RenderViewHost* render_view_host,
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           int32 page_id, const std::wstring& title) {}
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual int GetBrowserWindowID() const;
62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual ViewType::Type GetRenderViewType() const;
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual RenderViewHostDelegate::View* GetViewDelegate();
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ProcessWebUIMessage(
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const ExtensionHostMsg_DomMessage_Params& params);
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // NotificationObserver override.
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Observe(NotificationType type,
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationSource& source,
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationDetails& details);
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // RenderViewHostDelegate::View methods. Only the ones for opening new
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // windows are currently implemented.
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CreateNewWindow(
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int route_id,
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const ViewHostMsg_CreateWindow_Params& params);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void CreateNewWidget(int route_id, WebKit::WebPopupType popup_type) {}
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void CreateNewFullscreenWidget(int route_id) {}
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ShowCreatedWindow(int route_id,
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 WindowOpenDisposition disposition,
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const gfx::Rect& initial_pos,
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 bool user_gesture);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ShowCreatedWidget(int route_id,
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const gfx::Rect& initial_pos) {}
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void ShowCreatedFullscreenWidget(int route_id) {}
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ShowContextMenu(const ContextMenuParams& params) {}
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void ShowPopupMenu(const gfx::Rect& bounds,
89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             int item_height,
90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             double item_font_size,
91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             int selected_item,
92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             const std::vector<WebMenuItem>& items,
93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             bool right_aligned) {}
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void StartDragging(const WebDropData& drop_data,
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             WebKit::WebDragOperationsMask allowed_ops) {}
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void StartDragging(const WebDropData&,
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             WebKit::WebDragOperationsMask,
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             const SkBitmap&,
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             const gfx::Point&) {}
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void UpdateDragCursor(WebKit::WebDragOperation operation) {}
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void GotFocus() {}
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TakeFocus(bool reverse) {}
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void LostCapture() {}
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void Activate() {}
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void Deactivate() {}
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                      bool* is_keyboard_shortcut);
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {}
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void HandleMouseMove() {}
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void HandleMouseDown();
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void HandleMouseLeave() {}
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void HandleMouseUp() {}
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void HandleMouseActivate() {}
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void UpdatePreferredSize(const gfx::Size& pref_size);
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual RendererPreferences GetRendererPrefs(Profile* profile) const;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Enable Web UI. This has to be called before renderer is created.
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void EnableWebUI();
1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void UpdateInspectorSetting(const std::string& key,
121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                      const std::string& value);
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void ClearInspectorSettings();
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual ~BalloonHost();
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Must override in platform specific implementations.
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void InitRenderWidgetHostView() = 0;
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual RenderWidgetHostView* render_widget_host_view() const = 0;
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Owned pointer to the host for the renderer process.
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RenderViewHost* render_view_host_;
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called to send an event that the balloon has been disconnected from
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a renderer (if should_notify_on_disconnect_ is true).
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void NotifyDisconnect();
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Non-owned pointer to the associated balloon.
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Balloon* balloon_;
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True after Init() has completed.
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool initialized_;
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Indicates whether we should notify about disconnection of this balloon.
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is used to ensure disconnection notifications only happen if
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a connection notification has happened and that they happen only once.
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool should_notify_on_disconnect_;
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Site instance for the balloon/profile, to be used for opening new links.
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<SiteInstance> site_instance_;
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Common implementations of some RenderViewHostDelegate::View methods.
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RenderViewHostDelegateViewHelper delegate_view_helper_;
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Handles requests to extension APIs. Will only be non-NULL if we are
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // rendering a page from an extension.
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<ExtensionFunctionDispatcher> extension_function_dispatcher_;
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // A flag to enable Web UI.
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool enable_web_ui_;
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NotificationRegistrar registrar_;
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_NOTIFICATIONS_BALLOON_HOST_H_
166