1// Copyright 2013 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_RENDERER_PLUGINS_CHROME_PLUGIN_PLACEHOLDER_H_
6#define CHROME_RENDERER_PLUGINS_CHROME_PLUGIN_PLACEHOLDER_H_
7
8#include "components/plugins/renderer/plugin_placeholder.h"
9
10struct ChromeViewHostMsg_GetPluginInfo_Status;
11
12class ChromePluginPlaceholder : public plugins::PluginPlaceholder,
13                                public content::RenderProcessObserver,
14                                public content::ContextMenuClient {
15 public:
16  static const char kPluginPlaceholderDataURL[];
17
18  static ChromePluginPlaceholder* CreateBlockedPlugin(
19      content::RenderFrame* render_frame,
20      blink::WebLocalFrame* frame,
21      const blink::WebPluginParams& params,
22      const content::WebPluginInfo& info,
23      const std::string& identifier,
24      const base::string16& name,
25      int resource_id,
26      const base::string16& message);
27
28  // Creates a new WebViewPlugin with a MissingPlugin as a delegate.
29  static ChromePluginPlaceholder* CreateMissingPlugin(
30      content::RenderFrame* render_frame,
31      blink::WebLocalFrame* frame,
32      const blink::WebPluginParams& params);
33
34  static ChromePluginPlaceholder* CreateErrorPlugin(
35      content::RenderFrame* render_frame,
36      const base::FilePath& plugin_path);
37
38  void SetStatus(const ChromeViewHostMsg_GetPluginInfo_Status& status);
39
40#if defined(ENABLE_PLUGIN_INSTALLATION)
41  int32 CreateRoutingId();
42#endif
43
44 private:
45  ChromePluginPlaceholder(content::RenderFrame* render_frame,
46                          blink::WebLocalFrame* frame,
47                          const blink::WebPluginParams& params,
48                          const std::string& html_data,
49                          const base::string16& title);
50  virtual ~ChromePluginPlaceholder();
51
52  // WebViewPlugin::Delegate (via PluginPlaceholder) method
53  virtual void BindWebFrame(blink::WebFrame* frame) OVERRIDE;
54
55  // gin::Wrappable (via PluginPlaceholder) method
56  virtual gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
57      v8::Isolate* isolate) OVERRIDE;
58
59  // content::RenderViewObserver (via PluginPlaceholder) override:
60  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
61
62  // WebViewPlugin::Delegate (via PluginPlaceholder) methods:
63  virtual void ShowContextMenu(const blink::WebMouseEvent&) OVERRIDE;
64
65  // content::RenderProcessObserver methods:
66  virtual void PluginListChanged() OVERRIDE;
67
68  // content::ContextMenuClient methods:
69  virtual void OnMenuAction(int request_id, unsigned action) OVERRIDE;
70  virtual void OnMenuClosed(int request_id) OVERRIDE;
71
72  // Javascript callback opens chrome://plugins in a new tab.
73  void OpenAboutPluginsCallback();
74
75  void OnLoadBlockedPlugins(const std::string& identifier);
76  void OnSetIsPrerendering(bool is_prerendering);
77#if defined(ENABLE_PLUGIN_INSTALLATION)
78  void OnDidNotFindMissingPlugin();
79  void OnFoundMissingPlugin(const base::string16& plugin_name);
80  void OnStartedDownloadingPlugin();
81  void OnFinishedDownloadingPlugin();
82  void OnErrorDownloadingPlugin(const std::string& error);
83  void OnCancelledDownloadingPlugin();
84#endif
85
86  // We use a scoped_ptr so we can forward-declare the struct; it's defined in
87  // an IPC message file which can't be easily included in other header files.
88  scoped_ptr<ChromeViewHostMsg_GetPluginInfo_Status> status_;
89
90  base::string16 title_;
91
92#if defined(ENABLE_PLUGIN_INSTALLATION)
93  // |routing_id()| is the routing ID of our associated RenderView, but we have
94  // a separate routing ID for messages specific to this placeholder.
95  int32 placeholder_routing_id_;
96#endif
97
98  bool has_host_;
99  int context_menu_request_id_;  // Nonzero when request pending.
100  base::string16 plugin_name_;
101
102  DISALLOW_COPY_AND_ASSIGN(ChromePluginPlaceholder);
103};
104
105#endif  // CHROME_RENDERER_PLUGINS_CHROME_PLUGIN_PLACEHOLDER_H_
106