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