1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_PANELS_PANEL_HOST_H_
6#define CHROME_BROWSER_UI_PANELS_PANEL_HOST_H_
7
8#include "base/memory/scoped_ptr.h"
9#include "base/memory/weak_ptr.h"
10#include "chrome/browser/extensions/extension_function_dispatcher.h"
11#include "content/public/browser/web_contents_delegate.h"
12#include "content/public/browser/web_contents_observer.h"
13#include "content/public/common/page_zoom.h"
14
15class FaviconTabHelper;
16class GURL;
17class Panel;
18class PrefsTabHelper;
19class Profile;
20
21namespace content {
22class WebContents;
23}
24
25namespace extensions {
26class WindowController;
27}
28
29namespace gfx {
30class Image;
31class Rect;
32}
33
34// Helper class for Panel, implementing WebContents hosting and Extension
35// delegates. Owned and used by Panel only.
36class PanelHost : public content::WebContentsDelegate,
37                  public content::WebContentsObserver,
38                  public ExtensionFunctionDispatcher::Delegate {
39 public:
40  PanelHost(Panel* panel, Profile* profile);
41  virtual ~PanelHost();
42
43  void Init(const GURL& url);
44  content::WebContents* web_contents() { return web_contents_.get(); }
45  void DestroyWebContents();
46
47  // Returns the icon for the current page.
48  gfx::Image GetPageIcon() const;
49
50  // content::WebContentsDelegate overrides.
51  virtual content::WebContents* OpenURLFromTab(
52      content::WebContents* source,
53      const content::OpenURLParams& params) OVERRIDE;
54  virtual void NavigationStateChanged(const content::WebContents* source,
55                                      unsigned changed_flags) OVERRIDE;
56  virtual void AddNewContents(content::WebContents* source,
57                              content::WebContents* new_contents,
58                              WindowOpenDisposition disposition,
59                              const gfx::Rect& initial_pos,
60                              bool user_gesture,
61                              bool* was_blocked) OVERRIDE;
62  virtual void ActivateContents(content::WebContents* contents) OVERRIDE;
63  virtual void DeactivateContents(content::WebContents* contents) OVERRIDE;
64  virtual void LoadingStateChanged(content::WebContents* source) OVERRIDE;
65  virtual void CloseContents(content::WebContents* source) OVERRIDE;
66  virtual void MoveContents(content::WebContents* source,
67                            const gfx::Rect& pos) OVERRIDE;
68  virtual bool IsPopupOrPanel(
69      const content::WebContents* source) const OVERRIDE;
70  virtual void ContentsZoomChange(bool zoom_in) OVERRIDE;
71  virtual void HandleKeyboardEvent(
72      content::WebContents* source,
73      const content::NativeWebKeyboardEvent& event) OVERRIDE;
74  virtual void WebContentsFocused(content::WebContents* contents) OVERRIDE;
75  virtual void ResizeDueToAutoResize(content::WebContents* web_contents,
76                                     const gfx::Size& new_size) OVERRIDE;
77
78  // content::WebContentsObserver overrides.
79  virtual void RenderViewCreated(
80      content::RenderViewHost* render_view_host) OVERRIDE;
81  virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE;
82  virtual void WebContentsDestroyed(
83      content::WebContents* web_contents) OVERRIDE;
84  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
85
86  // ExtensionFunctionDispatcher::Delegate overrides.
87  virtual extensions::WindowController* GetExtensionWindowController() const
88      OVERRIDE;
89  virtual content::WebContents* GetAssociatedWebContents() const OVERRIDE;
90
91  // Actions on web contents.
92  void Reload();
93  void ReloadIgnoringCache();
94  void StopLoading();
95  void Zoom(content::PageZoom zoom);
96
97 private:
98  // Helper to close panel via the message loop.
99  void ClosePanel();
100
101  // Message handlers.
102  void OnRequest(const ExtensionHostMsg_Request_Params& params);
103
104  Panel* panel_;  // Weak, owns us.
105  Profile* profile_;
106  ExtensionFunctionDispatcher extension_function_dispatcher_;
107
108  scoped_ptr<content::WebContents> web_contents_;
109
110  // The following factory is used to close the panel via the message loop.
111  base::WeakPtrFactory<PanelHost> weak_factory_;
112
113  DISALLOW_COPY_AND_ASSIGN(PanelHost);
114};
115
116#endif  // CHROME_BROWSER_UI_PANELS_PANEL_HOST_H_
117