webview_plugin.h revision 116680a4aac90f2aa7413d9095a592090648e557
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 COMPONENTS_PLUGINS_RENDERER_WEBVIEW_PLUGIN_H_
6#define COMPONENTS_PLUGINS_RENDERER_WEBVIEW_PLUGIN_H_
7
8#include <list>
9
10#include "base/memory/scoped_ptr.h"
11#include "base/sequenced_task_runner_helpers.h"
12#include "third_party/WebKit/public/platform/WebCursorInfo.h"
13#include "third_party/WebKit/public/platform/WebString.h"
14#include "third_party/WebKit/public/platform/WebURLResponse.h"
15#include "third_party/WebKit/public/web/WebFrameClient.h"
16#include "third_party/WebKit/public/web/WebPlugin.h"
17#include "third_party/WebKit/public/web/WebViewClient.h"
18
19namespace blink {
20class WebMouseEvent;
21}
22
23namespace content {
24class RenderView;
25struct WebPreferences;
26}
27
28// This class implements the WebPlugin interface by forwarding drawing and
29// handling input events to a WebView.
30// It can be used as a placeholder for an actual plugin, using HTML for the UI.
31// To show HTML data inside the WebViewPlugin,
32// call web_view->mainFrame()->loadHTMLString() with the HTML data and a fake
33// chrome:// URL as origin.
34
35class WebViewPlugin : public blink::WebPlugin,
36                      public blink::WebViewClient,
37                      public blink::WebFrameClient {
38 public:
39  class Delegate {
40   public:
41    // Bind |frame| to a Javascript object, enabling the delegate to receive
42    // callback methods from Javascript inside the WebFrame.
43    // This method is called from WebFrameClient::didClearWindowObject.
44    virtual void BindWebFrame(blink::WebFrame* frame) = 0;
45
46    // Called upon a context menu event.
47    virtual void ShowContextMenu(const blink::WebMouseEvent&) = 0;
48
49    // Called when the WebViewPlugin is destroyed.
50    virtual void PluginDestroyed() = 0;
51  };
52
53  // Convenience method to set up a new WebViewPlugin using |preferences|
54  // and displaying |html_data|. |url| should be a (fake) chrome:// URL; it is
55  // only used for navigation and never actually resolved.
56  static WebViewPlugin* Create(Delegate* delegate,
57                               const content::WebPreferences& preferences,
58                               const std::string& html_data,
59                               const GURL& url);
60
61  blink::WebView* web_view() { return web_view_; }
62
63  // When loading a plug-in document (i.e. a full page plug-in not embedded in
64  // another page), we save all data that has been received, and replay it with
65  // this method on the actual plug-in.
66  void ReplayReceivedData(blink::WebPlugin* plugin);
67
68  void RestoreTitleText();
69
70  // WebPlugin methods:
71  virtual blink::WebPluginContainer* container() const;
72  virtual bool initialize(blink::WebPluginContainer*);
73  virtual void destroy();
74
75  virtual NPObject* scriptableObject();
76  virtual struct _NPP* pluginNPP();
77
78  virtual bool getFormValue(blink::WebString& value);
79
80  virtual void paint(blink::WebCanvas* canvas, const blink::WebRect& rect);
81
82  // Coordinates are relative to the containing window.
83  virtual void updateGeometry(
84      const blink::WebRect& frame_rect,
85      const blink::WebRect& clip_rect,
86      const blink::WebVector<blink::WebRect>& cut_out_rects,
87      bool is_visible);
88
89  virtual void updateFocus(bool);
90  virtual void updateVisibility(bool) {}
91
92  virtual bool acceptsInputEvents();
93  virtual bool handleInputEvent(const blink::WebInputEvent& event,
94                                blink::WebCursorInfo& cursor_info);
95
96  virtual void didReceiveResponse(const blink::WebURLResponse& response);
97  virtual void didReceiveData(const char* data, int data_length);
98  virtual void didFinishLoading();
99  virtual void didFailLoading(const blink::WebURLError& error);
100
101  // Called in response to WebPluginContainer::loadFrameRequest
102  virtual void didFinishLoadingFrameRequest(const blink::WebURL& url,
103                                            void* notifyData) {}
104  virtual void didFailLoadingFrameRequest(const blink::WebURL& url,
105                                          void* notify_data,
106                                          const blink::WebURLError& error) {}
107
108  // WebViewClient methods:
109  virtual bool acceptsLoadDrops();
110
111  virtual void setToolTipText(const blink::WebString&,
112                              blink::WebTextDirection);
113
114  virtual void startDragging(blink::WebLocalFrame* frame,
115                             const blink::WebDragData& drag_data,
116                             blink::WebDragOperationsMask mask,
117                             const blink::WebImage& image,
118                             const blink::WebPoint& point);
119
120  // TODO(ojan): Remove this override and have this class use a non-null
121  // layerTreeView.
122  virtual bool allowsBrokenNullLayerTreeView() const;
123
124  // WebWidgetClient methods:
125  virtual void didInvalidateRect(const blink::WebRect&);
126  virtual void didChangeCursor(const blink::WebCursorInfo& cursor);
127
128  // WebFrameClient methods:
129  virtual void didClearWindowObject(blink::WebLocalFrame* frame);
130
131  // This method is defined in WebPlugin as well as in WebFrameClient, but with
132  // different parameters. We only care about implementing the WebPlugin
133  // version, so we implement this method and call the default in WebFrameClient
134  // (which does nothing) to correctly overload it.
135  virtual void didReceiveResponse(blink::WebLocalFrame* frame,
136                                  unsigned identifier,
137                                  const blink::WebURLResponse& response);
138
139 private:
140  friend class base::DeleteHelper<WebViewPlugin>;
141  WebViewPlugin(Delegate* delegate, const content::WebPreferences& preferences);
142  virtual ~WebViewPlugin();
143
144  // Manages its own lifetime.
145  Delegate* delegate_;
146
147  blink::WebCursorInfo current_cursor_;
148
149  // Owns us.
150  blink::WebPluginContainer* container_;
151
152  // Owned by us, deleted via |close()|.
153  blink::WebView* web_view_;
154
155  // Owned by us, deleted via |close()|.
156  blink::WebFrame* web_frame_;
157  gfx::Rect rect_;
158
159  blink::WebURLResponse response_;
160  std::list<std::string> data_;
161  bool finished_loading_;
162  scoped_ptr<blink::WebURLError> error_;
163  blink::WebString old_title_;
164  bool focused_;
165};
166
167#endif  // COMPONENTS_PLUGINS_RENDERER_WEBVIEW_PLUGIN_H_
168