| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_RENDERER_PLUGINS_PLUGIN_PLACEHOLDER_H_ | 5 #ifndef CHROME_RENDERER_PLUGINS_CHROME_PLUGIN_PLACEHOLDER_H_ |
| 6 #define CHROME_RENDERER_PLUGINS_PLUGIN_PLACEHOLDER_H_ | 6 #define CHROME_RENDERER_PLUGINS_CHROME_PLUGIN_PLACEHOLDER_H_ |
| 7 | 7 |
| 8 #include "chrome/renderer/plugins/webview_plugin.h" | 8 #include "components/plugins/renderer/plugin_placeholder.h" |
| 9 #include "content/public/common/webplugininfo.h" | |
| 10 #include "content/public/renderer/context_menu_client.h" | |
| 11 #include "content/public/renderer/render_process_observer.h" | |
| 12 #include "content/public/renderer/render_view_observer.h" | |
| 13 #include "third_party/WebKit/public/web/WebPluginParams.h" | |
| 14 #include "webkit/renderer/cpp_bound_class.h" | |
| 15 | 9 |
| 16 struct ChromeViewHostMsg_GetPluginInfo_Status; | 10 struct ChromeViewHostMsg_GetPluginInfo_Status; |
| 17 | 11 |
| 18 namespace content { | 12 class ChromePluginPlaceholder : public plugins::PluginPlaceholder, |
| 19 struct WebPluginInfo; | 13 public content::RenderProcessObserver, |
| 20 } | 14 public content::ContextMenuClient { |
| 15 public: |
| 16 static const char kPluginPlaceholderDataURL[]; |
| 21 | 17 |
| 22 // Placeholders can be used if a plug-in is missing or not available | 18 static ChromePluginPlaceholder* CreateBlockedPlugin( |
| 23 // (blocked or disabled). | |
| 24 class PluginPlaceholder : public content::RenderViewObserver, | |
| 25 public content::RenderProcessObserver, | |
| 26 public webkit_glue::CppBoundClass, | |
| 27 public WebViewPlugin::Delegate, | |
| 28 public content::ContextMenuClient { | |
| 29 public: | |
| 30 // Creates a new WebViewPlugin with a MissingPlugin as a delegate. | |
| 31 static PluginPlaceholder* CreateMissingPlugin( | |
| 32 content::RenderView* render_view, | |
| 33 WebKit::WebFrame* frame, | |
| 34 const WebKit::WebPluginParams& params); | |
| 35 | |
| 36 static PluginPlaceholder* CreateErrorPlugin( | |
| 37 content::RenderView* render_view, | |
| 38 const base::FilePath& plugin_path); | |
| 39 | |
| 40 static PluginPlaceholder* CreateBlockedPlugin( | |
| 41 content::RenderView* render_view, | 19 content::RenderView* render_view, |
| 42 WebKit::WebFrame* frame, | 20 WebKit::WebFrame* frame, |
| 43 const WebKit::WebPluginParams& params, | 21 const WebKit::WebPluginParams& params, |
| 44 const content::WebPluginInfo& info, | 22 const content::WebPluginInfo& info, |
| 45 const std::string& identifier, | 23 const std::string& identifier, |
| 46 const string16& name, | 24 const string16& name, |
| 47 int resource_id, | 25 int resource_id, |
| 48 const string16& message); | 26 const string16& message); |
| 49 | 27 |
| 50 #if defined(ENABLE_MOBILE_YOUTUBE_PLUGIN) | 28 // Creates a new WebViewPlugin with a MissingPlugin as a delegate. |
| 51 // Placeholder for old style embedded youtube video on mobile device. For old | 29 static ChromePluginPlaceholder* CreateMissingPlugin( |
| 52 // style embedded youtube video, it has a url in the form of | 30 content::RenderView* render_view, |
| 53 // http://www.youtube.com/v/VIDEO_ID. This placeholder replaces the url with a | 31 WebKit::WebFrame* frame, |
| 54 // simple html page and clicking the play image redirects the user to the | 32 const WebKit::WebPluginParams& params); |
| 55 // mobile youtube app. | |
| 56 static PluginPlaceholder* CreateMobileYoutubePlugin( | |
| 57 content::RenderView* render_view, | |
| 58 WebKit::WebFrame* frame, | |
| 59 const WebKit::WebPluginParams& params); | |
| 60 #endif | |
| 61 | 33 |
| 62 WebViewPlugin* plugin() { return plugin_; } | 34 static ChromePluginPlaceholder* CreateErrorPlugin( |
| 63 | 35 content::RenderView* render_view, |
| 64 void set_blocked_for_prerendering(bool blocked_for_prerendering) { | 36 const base::FilePath& plugin_path); |
| 65 is_blocked_for_prerendering_ = blocked_for_prerendering; | |
| 66 } | |
| 67 | |
| 68 void set_allow_loading(bool allow_loading) { allow_loading_ = allow_loading; } | |
| 69 | 37 |
| 70 void SetStatus(const ChromeViewHostMsg_GetPluginInfo_Status& status); | 38 void SetStatus(const ChromeViewHostMsg_GetPluginInfo_Status& status); |
| 71 | 39 |
| 72 #if defined(ENABLE_PLUGIN_INSTALLATION) | 40 #if defined(ENABLE_PLUGIN_INSTALLATION) |
| 73 int32 CreateRoutingId(); | 41 int32 CreateRoutingId(); |
| 74 #endif | 42 #endif |
| 75 | 43 |
| 76 #if defined(ENABLE_MOBILE_YOUTUBE_PLUGIN) | 44 private: |
| 77 // Whether this is a youtube url. | 45 ChromePluginPlaceholder(content::RenderView* render_view, |
| 78 static bool IsYouTubeURL(const GURL& url, const std::string& mime_type); | 46 WebKit::WebFrame* frame, |
| 79 #endif | 47 const WebKit::WebPluginParams& params, |
| 48 const std::string& html_data, |
| 49 const string16& title); |
| 50 virtual ~ChromePluginPlaceholder(); |
| 80 | 51 |
| 81 private: | 52 // WebViewPlugin::Delegate (via PluginPlaceholder) method |
| 82 // |render_view| and |frame| are weak pointers. If either one is going away, | 53 virtual void BindWebFrame(WebKit::WebFrame* frame) OVERRIDE; |
| 83 // our |plugin_| will be destroyed as well and will notify us. | |
| 84 PluginPlaceholder(content::RenderView* render_view, | |
| 85 WebKit::WebFrame* frame, | |
| 86 const WebKit::WebPluginParams& params, | |
| 87 const std::string& html_data, | |
| 88 const string16& title); | |
| 89 | 54 |
| 90 virtual ~PluginPlaceholder(); | 55 // content::RenderViewObserver (via PluginPlaceholder) override: |
| 56 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; |
| 91 | 57 |
| 92 // WebViewPlugin::Delegate methods: | 58 // WebViewPlugin::Delegate (via PluginPlaceholder) methods: |
| 93 virtual void BindWebFrame(WebKit::WebFrame* frame) OVERRIDE; | |
| 94 virtual void WillDestroyPlugin() OVERRIDE; | |
| 95 virtual void ShowContextMenu(const WebKit::WebMouseEvent&) OVERRIDE; | 59 virtual void ShowContextMenu(const WebKit::WebMouseEvent&) OVERRIDE; |
| 96 | 60 |
| 97 // content::RenderViewObserver methods: | |
| 98 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; | |
| 99 | |
| 100 // content::RenderProcessObserver methods: | 61 // content::RenderProcessObserver methods: |
| 101 virtual void PluginListChanged() OVERRIDE; | 62 virtual void PluginListChanged() OVERRIDE; |
| 102 | 63 |
| 103 // content::ContextMenuClient methods: | 64 // content::ContextMenuClient methods: |
| 104 virtual void OnMenuAction(int request_id, unsigned action) OVERRIDE; | 65 virtual void OnMenuAction(int request_id, unsigned action) OVERRIDE; |
| 105 virtual void OnMenuClosed(int request_id) OVERRIDE; | 66 virtual void OnMenuClosed(int request_id) OVERRIDE; |
| 106 | 67 |
| 107 // Replace this placeholder with a different plugin (which could be | 68 // Javascript callback opens chrome://plugins in a new tab. |
| 108 // a placeholder again). | 69 // Arguments are required by the caller, but not used. |
| 109 void ReplacePlugin(WebKit::WebPlugin* new_plugin); | |
| 110 | |
| 111 // Hide this placeholder. | |
| 112 void HidePlugin(); | |
| 113 | |
| 114 // Load the blocked plugin. | |
| 115 void LoadPlugin(); | |
| 116 | |
| 117 // Javascript callbacks: | |
| 118 // Load the blocked plugin by calling LoadPlugin(). | |
| 119 // Takes no arguments, and returns nothing. | |
| 120 void LoadCallback(const webkit_glue::CppArgumentList& args, | |
| 121 webkit_glue::CppVariant* result); | |
| 122 | |
| 123 // Hide the blocked plugin by calling HidePlugin(). | |
| 124 // Takes no arguments, and returns nothing. | |
| 125 void HideCallback(const webkit_glue::CppArgumentList& args, | |
| 126 webkit_glue::CppVariant* result); | |
| 127 | |
| 128 // Opens chrome://plugins in a new tab. | |
| 129 // Takes no arguments, and returns nothing. | |
| 130 void OpenAboutPluginsCallback(const webkit_glue::CppArgumentList& args, | 70 void OpenAboutPluginsCallback(const webkit_glue::CppArgumentList& args, |
| 131 webkit_glue::CppVariant* result); | 71 webkit_glue::CppVariant* result); |
| 132 | 72 |
| 133 void DidFinishLoadingCallback(const webkit_glue::CppArgumentList& args, | |
| 134 webkit_glue::CppVariant* result); | |
| 135 | |
| 136 void OnLoadBlockedPlugins(const std::string& identifier); | 73 void OnLoadBlockedPlugins(const std::string& identifier); |
| 137 void OnSetIsPrerendering(bool is_prerendering); | 74 void OnSetIsPrerendering(bool is_prerendering); |
| 138 #if defined(ENABLE_PLUGIN_INSTALLATION) | 75 #if defined(ENABLE_PLUGIN_INSTALLATION) |
| 139 void OnDidNotFindMissingPlugin(); | 76 void OnDidNotFindMissingPlugin(); |
| 140 void OnFoundMissingPlugin(const string16& plugin_name); | 77 void OnFoundMissingPlugin(const string16& plugin_name); |
| 141 void OnStartedDownloadingPlugin(); | 78 void OnStartedDownloadingPlugin(); |
| 142 void OnFinishedDownloadingPlugin(); | 79 void OnFinishedDownloadingPlugin(); |
| 143 void OnErrorDownloadingPlugin(const std::string& error); | 80 void OnErrorDownloadingPlugin(const std::string& error); |
| 144 void OnCancelledDownloadingPlugin(); | 81 void OnCancelledDownloadingPlugin(); |
| 145 #endif | 82 #endif |
| 146 | 83 |
| 147 #if defined(ENABLE_MOBILE_YOUTUBE_PLUGIN) | |
| 148 // Check whether the url is valid. | |
| 149 static bool IsValidYouTubeVideo(const std::string& path); | |
| 150 | |
| 151 // Opens a youtube app in the current tab. | |
| 152 void OpenYoutubeUrlCallback(const webkit_glue::CppArgumentList& args, | |
| 153 webkit_glue::CppVariant* result); | |
| 154 #endif | |
| 155 | |
| 156 void SetMessage(const string16& message); | |
| 157 void UpdateMessage(); | |
| 158 | |
| 159 WebKit::WebFrame* frame_; | |
| 160 WebKit::WebPluginParams plugin_params_; | |
| 161 WebViewPlugin* plugin_; | |
| 162 | |
| 163 content::WebPluginInfo plugin_info_; | |
| 164 | |
| 165 string16 title_; | |
| 166 string16 message_; | |
| 167 | |
| 168 // We use a scoped_ptr so we can forward-declare the struct; it's defined in | 84 // We use a scoped_ptr so we can forward-declare the struct; it's defined in |
| 169 // an IPC message file which can't be easily included in other header files. | 85 // an IPC message file which can't be easily included in other header files. |
| 170 scoped_ptr<ChromeViewHostMsg_GetPluginInfo_Status> status_; | 86 scoped_ptr<ChromeViewHostMsg_GetPluginInfo_Status> status_; |
| 171 | 87 |
| 172 // True iff the plugin was blocked because the page was being prerendered. | 88 string16 title_; |
| 173 // Plugin will automatically be loaded when the page is displayed. | |
| 174 bool is_blocked_for_prerendering_; | |
| 175 bool allow_loading_; | |
| 176 | 89 |
| 177 #if defined(ENABLE_PLUGIN_INSTALLATION) | 90 #if defined(ENABLE_PLUGIN_INSTALLATION) |
| 178 // |routing_id()| is the routing ID of our associated RenderView, but we have | 91 // |routing_id()| is the routing ID of our associated RenderView, but we have |
| 179 // a separate routing ID for messages specific to this placeholder. | 92 // a separate routing ID for messages specific to this placeholder. |
| 180 int32 placeholder_routing_id_; | 93 int32 placeholder_routing_id_; |
| 181 #endif | 94 #endif |
| 182 | 95 |
| 183 bool hidden_; | |
| 184 bool has_host_; | 96 bool has_host_; |
| 185 bool finished_loading_; | 97 int context_menu_request_id_; // Nonzero when request pending. |
| 186 string16 plugin_name_; | 98 string16 plugin_name_; |
| 187 std::string identifier_; | |
| 188 int context_menu_request_id_; // Nonzero when request pending. | |
| 189 | 99 |
| 190 DISALLOW_COPY_AND_ASSIGN(PluginPlaceholder); | 100 DISALLOW_COPY_AND_ASSIGN(ChromePluginPlaceholder); |
| 191 }; | 101 }; |
| 192 | 102 |
| 193 #endif // CHROME_RENDERER_PLUGINS_PLUGIN_PLACEHOLDER_H_ | 103 #endif // CHROME_RENDERER_PLUGINS_CHROME_PLUGIN_PLACEHOLDER_H_ |
| OLD | NEW |