diff options
author | aberent@chromium.org <aberent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-16 11:33:57 +0000 |
---|---|---|
committer | aberent@chromium.org <aberent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-16 11:33:57 +0000 |
commit | 5a174e280c39355c6488dc992173366b142ffef1 (patch) | |
tree | 4c2e957457602357503b78df35a0e7ac0cb6716c /components/plugins/renderer/webview_plugin.h | |
parent | e029c3eeac49e3d3133de7b2fbfe47e0c14fc0e7 (diff) | |
download | chromium_src-5a174e280c39355c6488dc992173366b142ffef1.zip chromium_src-5a174e280c39355c6488dc992173366b142ffef1.tar.gz chromium_src-5a174e280c39355c6488dc992173366b142ffef1.tar.bz2 |
Move renderer plugin code into a new component (re-land)
Android Webview needs to use some of the renderer plugin code, however
this code is currently in chrome. This commit moves the parts of this
code that don't depend on the rest of chrome into a new component.
This is a new commit of https://codereview.chromium.org/23606022
which had to be reverted due to a use after free problem, now
fixed.
The only change from the previous CL is to
chrome_plugin_placeholder.cc so TBR'ing owners of other files.
TBR=darin@chromium.org, joi@chromium.org
BUG=283713, 306815, 306803
Review URL: https://codereview.chromium.org/27197004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@228900 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components/plugins/renderer/webview_plugin.h')
-rw-r--r-- | components/plugins/renderer/webview_plugin.h | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/components/plugins/renderer/webview_plugin.h b/components/plugins/renderer/webview_plugin.h new file mode 100644 index 0000000..13e480c --- /dev/null +++ b/components/plugins/renderer/webview_plugin.h @@ -0,0 +1,155 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_PLUGINS_RENDERER_WEBVIEW_PLUGIN_H_ +#define COMPONENTS_PLUGINS_RENDERER_WEBVIEW_PLUGIN_H_ + +#include <list> + +#include "base/memory/scoped_ptr.h" +#include "base/sequenced_task_runner_helpers.h" +#include "third_party/WebKit/public/platform/WebString.h" +#include "third_party/WebKit/public/platform/WebURLResponse.h" +#include "third_party/WebKit/public/web/WebCursorInfo.h" +#include "third_party/WebKit/public/web/WebFrameClient.h" +#include "third_party/WebKit/public/web/WebPlugin.h" +#include "third_party/WebKit/public/web/WebViewClient.h" + +struct WebPreferences; + +namespace WebKit { +class WebMouseEvent; +} + +// This class implements the WebPlugin interface by forwarding drawing and +// handling input events to a WebView. +// It can be used as a placeholder for an actual plugin, using HTML for the UI. +// To show HTML data inside the WebViewPlugin, +// call web_view->mainFrame()->loadHTMLString() with the HTML data and a fake +// chrome:// URL as origin. + +class WebViewPlugin : public WebKit::WebPlugin, + public WebKit::WebViewClient, + public WebKit::WebFrameClient { + public: + class Delegate { + public: + // Bind |frame| to a Javascript object, enabling the delegate to receive + // callback methods from Javascript inside the WebFrame. + // This method is called from WebFrameClient::didClearWindowObject. + virtual void BindWebFrame(WebKit::WebFrame* frame) = 0; + + // Called before the WebViewPlugin is destroyed. The delegate should delete + // itself here. + virtual void WillDestroyPlugin() = 0; + + // Called upon a context menu event. + virtual void ShowContextMenu(const WebKit::WebMouseEvent&) = 0; + }; + + explicit WebViewPlugin(Delegate* delegate); + + // Convenience method to set up a new WebViewPlugin using |preferences| + // and displaying |html_data|. |url| should be a (fake) chrome:// URL; it is + // only used for navigation and never actually resolved. + static WebViewPlugin* Create(Delegate* delegate, + const WebPreferences& preferences, + const std::string& html_data, + const GURL& url); + + WebKit::WebView* web_view() { return web_view_; } + + // When loading a plug-in document (i.e. a full page plug-in not embedded in + // another page), we save all data that has been received, and replay it with + // this method on the actual plug-in. + void ReplayReceivedData(WebKit::WebPlugin* plugin); + + void RestoreTitleText(); + + // WebPlugin methods: + virtual WebKit::WebPluginContainer* container() const; + virtual bool initialize(WebKit::WebPluginContainer*); + virtual void destroy(); + + virtual NPObject* scriptableObject(); + virtual struct _NPP* pluginNPP(); + + virtual bool getFormValue(WebKit::WebString& value); + + virtual void paint(WebKit::WebCanvas* canvas, const WebKit::WebRect& rect); + + // Coordinates are relative to the containing window. + virtual void updateGeometry( + const WebKit::WebRect& frame_rect, + const WebKit::WebRect& clip_rect, + const WebKit::WebVector<WebKit::WebRect>& cut_out_rects, + bool is_visible); + + virtual void updateFocus(bool) {} + virtual void updateVisibility(bool) {} + + virtual bool acceptsInputEvents(); + virtual bool handleInputEvent(const WebKit::WebInputEvent& event, + WebKit::WebCursorInfo& cursor_info); + + virtual void didReceiveResponse(const WebKit::WebURLResponse& response); + virtual void didReceiveData(const char* data, int data_length); + virtual void didFinishLoading(); + virtual void didFailLoading(const WebKit::WebURLError& error); + + // Called in response to WebPluginContainer::loadFrameRequest + virtual void didFinishLoadingFrameRequest(const WebKit::WebURL& url, + void* notifyData) {} + virtual void didFailLoadingFrameRequest(const WebKit::WebURL& url, + void* notify_data, + const WebKit::WebURLError& error) {} + + // WebViewClient methods: + virtual bool acceptsLoadDrops(); + + virtual void setToolTipText(const WebKit::WebString&, + WebKit::WebTextDirection); + + virtual void startDragging(WebKit::WebFrame* frame, + const WebKit::WebDragData& drag_data, + WebKit::WebDragOperationsMask mask, + const WebKit::WebImage& image, + const WebKit::WebPoint& point); + + // WebWidgetClient methods: + virtual void didInvalidateRect(const WebKit::WebRect&); + virtual void didChangeCursor(const WebKit::WebCursorInfo& cursor); + + // WebFrameClient methods: + virtual void didClearWindowObject(WebKit::WebFrame* frame); + + // This method is defined in WebPlugin as well as in WebFrameClient, but with + // different parameters. We only care about implementing the WebPlugin + // version, so we implement this method and call the default in WebFrameClient + // (which does nothing) to correctly overload it. + virtual void didReceiveResponse(WebKit::WebFrame* frame, + unsigned identifier, + const WebKit::WebURLResponse& response); + + private: + friend class base::DeleteHelper<WebViewPlugin>; + virtual ~WebViewPlugin(); + + Delegate* delegate_; + // Destroys itself. + WebKit::WebCursorInfo current_cursor_; + // Owns us. + WebKit::WebPluginContainer* container_; + // Owned by us, deleted via |close()|. + WebKit::WebView* web_view_; + gfx::Rect rect_; + + WebKit::WebURLResponse response_; + std::list<std::string> data_; + bool finished_loading_; + scoped_ptr<WebKit::WebURLError> error_; + WebKit::WebString old_title_; +}; + +#endif // COMPONENTS_PLUGINS_RENDERER_WEBVIEW_PLUGIN_H_ |