14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#ifndef COMPONENTS_PLUGINS_RENDERER_WEBVIEW_PLUGIN_H_ 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define COMPONENTS_PLUGINS_RENDERER_WEBVIEW_PLUGIN_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner_helpers.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebCursorInfo.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLResponse.h" 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrameClient.h" 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPlugin.h" 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebViewClient.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebMouseEvent; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace content { 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass RenderView; 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct WebPreferences; 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class implements the WebPlugin interface by forwarding drawing and 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handling input events to a WebView. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It can be used as a placeholder for an actual plugin, using HTML for the UI. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To show HTML data inside the WebViewPlugin, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// call web_view->mainFrame()->loadHTMLString() with the HTML data and a fake 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// chrome:// URL as origin. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class WebViewPlugin : public blink::WebPlugin, 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public blink::WebViewClient, 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public blink::WebFrameClient { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Delegate { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bind |frame| to a Javascript object, enabling the delegate to receive 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback methods from Javascript inside the WebFrame. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method is called from WebFrameClient::didClearWindowObject. 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void BindWebFrame(blink::WebFrame* frame) = 0; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called upon a context menu event. 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ShowContextMenu(const blink::WebMouseEvent&) = 0; 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Called when the WebViewPlugin is destroyed. 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void PluginDestroyed() = 0; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience method to set up a new WebViewPlugin using |preferences| 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and displaying |html_data|. |url| should be a (fake) chrome:// URL; it is 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only used for navigation and never actually resolved. 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static WebViewPlugin* Create(Delegate* delegate, 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const content::WebPreferences& preferences, 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& html_data, 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL& url); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebView* web_view() { return web_view_; } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When loading a plug-in document (i.e. a full page plug-in not embedded in 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another page), we save all data that has been received, and replay it with 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this method on the actual plug-in. 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void ReplayReceivedData(blink::WebPlugin* plugin); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void RestoreTitleText(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebPlugin methods: 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebPluginContainer* container() const; 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool initialize(blink::WebPluginContainer*); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void destroy(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NPObject* scriptableObject(); 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual struct _NPP* pluginNPP(); 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool getFormValue(blink::WebString& value); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void paint(blink::WebCanvas* canvas, const blink::WebRect& rect); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Coordinates are relative to the containing window. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void updateGeometry( 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebRect& frame_rect, 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebRect& clip_rect, 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebVector<blink::WebRect>& cut_out_rects, 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool is_visible); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void updateFocus(bool); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void updateVisibility(bool) {} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool acceptsInputEvents(); 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool handleInputEvent(const blink::WebInputEvent& event, 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebCursorInfo& cursor_info); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void didReceiveResponse(const blink::WebURLResponse& response); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didReceiveData(const char* data, int data_length); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didFinishLoading(); 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void didFailLoading(const blink::WebURLError& error); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called in response to WebPluginContainer::loadFrameRequest 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void didFinishLoadingFrameRequest(const blink::WebURL& url, 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void* notifyData) {} 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void didFailLoadingFrameRequest(const blink::WebURL& url, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* notify_data, 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLError& error) {} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebViewClient methods: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool acceptsLoadDrops(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void setToolTipText(const blink::WebString&, 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebTextDirection); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void startDragging(blink::WebLocalFrame* frame, 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebDragData& drag_data, 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDragOperationsMask mask, 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebImage& image, 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebPoint& point); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // TODO(ojan): Remove this override and have this class use a non-null 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // layerTreeView. 1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual bool allowsBrokenNullLayerTreeView() const; 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebWidgetClient methods: 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void didInvalidateRect(const blink::WebRect&); 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void didChangeCursor(const blink::WebCursorInfo& cursor); 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void scheduleAnimation(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebFrameClient methods: 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void didClearWindowObject(blink::WebLocalFrame* frame); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method is defined in WebPlugin as well as in WebFrameClient, but with 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different parameters. We only care about implementing the WebPlugin 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // version, so we implement this method and call the default in WebFrameClient 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (which does nothing) to correctly overload it. 136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void didReceiveResponse(blink::WebLocalFrame* frame, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned identifier, 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& response); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::DeleteHelper<WebViewPlugin>; 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebViewPlugin(Delegate* delegate, const content::WebPreferences& preferences); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WebViewPlugin(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Manages its own lifetime. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Delegate* delegate_; 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebCursorInfo current_cursor_; 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Owns us. 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPluginContainer* container_; 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Owned by us, deleted via |close()|. 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebView* web_view_; 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Owned by us, deleted via |close()|. 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blink::WebFrame* web_frame_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect rect_; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebURLResponse response_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<std::string> data_; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool finished_loading_; 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<blink::WebURLError> error_; 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString old_title_; 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool focused_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif // COMPONENTS_PLUGINS_RENDERER_WEBVIEW_PLUGIN_H_ 169