15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
5bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#ifndef CONTENT_RENDERER_NPAPI_WEBPLUGIN_DELEGATE_PROXY_H_
6bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#define CONTENT_RENDERER_NPAPI_WEBPLUGIN_DELEGATE_PROXY_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner_helpers.h"
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/webplugin_delegate.h"
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/common/webplugininfo.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_listener.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/surface/transport_dib.h"
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NPObject;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PluginHostMsg_URLRequest_Params;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WaitableEvent;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NPObjectStub;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginChannelHost;
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class RenderFrameImpl;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewImpl;
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class WebPluginImpl;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An implementation of WebPluginDelegate that proxies all calls to
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the plugin process.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebPluginDelegateProxy
48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    : public WebPluginDelegate,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public IPC::Listener,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public IPC::Sender,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::SupportsWeakPtr<WebPluginDelegateProxy> {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WebPluginDelegateProxy(WebPluginImpl* plugin,
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                         const std::string& mime_type,
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                         const base::WeakPtr<RenderViewImpl>& render_view,
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                         RenderFrameImpl* render_frame);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebPluginDelegate implementation:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PluginDestroyed() OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Initialize(const GURL& url,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::vector<std::string>& arg_names,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::vector<std::string>& arg_values,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          bool load_manually) OVERRIDE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateGeometry(const gfx::Rect& window_rect,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::Rect& clip_rect) OVERRIDE;
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void Paint(SkCanvas* canvas, const gfx::Rect& rect) OVERRIDE;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual NPObject* GetPluginScriptableObject() OVERRIDE;
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual struct _NPP* GetPluginNPP() OVERRIDE;
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual bool GetFormValue(base::string16* value) OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidFinishLoadWithReason(const GURL& url, NPReason reason,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int notify_id) OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetFocus(bool focused) OVERRIDE;
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool HandleInputEvent(const blink::WebInputEvent& event,
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                WebCursor::CursorInfo* cursor) OVERRIDE;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetProcessId() OVERRIDE;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Informs the plugin that its containing content view has gained or lost
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // first responder status.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetContentAreaFocus(bool has_focus);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Informs the plugin that plugin IME has updated its status.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ImeCompositionUpdated(
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& text,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<int>& clauses,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<int>& target,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int cursor_position,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int plugin_id);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Informs the plugin that plugin IME has completed.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |text| is empty, composition was cancelled.
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void ImeCompositionCompleted(const base::string16& text,
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       int plugin_id);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Informs the plugin that its enclosing window has gained or lost focus.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetWindowFocus(bool window_has_focus);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Informs the plugin that its container (window/tab) has changed visibility.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetContainerVisibility(bool is_visible);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Informs the plugin that its enclosing window's frame has changed.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void WindowFrameChanged(gfx::Rect window_frame, gfx::Rect view_frame);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Informs the plugin that plugin IME has completed.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |text| is empty, composition was cancelled.
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void ImeCompositionCompleted(const base::string16& text,
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       int plugin_id);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Listener implementation:
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnChannelError() OVERRIDE;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Sender implementation:
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Send(IPC::Message* msg) OVERRIDE;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SendJavaScriptStream(const GURL& url,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const std::string& result,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    bool success,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int notify_id) OVERRIDE;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidReceiveManualResponse(const GURL& url,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const std::string& mime_type,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const std::string& headers,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        uint32 expected_length,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        uint32 last_modified) OVERRIDE;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidReceiveManualData(const char* buffer, int length) OVERRIDE;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidFinishManualLoading() OVERRIDE;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidManualLoadFail() OVERRIDE;
126ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual WebPluginResourceClient* CreateResourceClient(
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned long resource_id, const GURL& url, int notify_id) OVERRIDE;
128ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual WebPluginResourceClient* CreateSeekableResourceClient(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned long resource_id, int range_request_id) OVERRIDE;
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void FetchURL(unsigned long resource_id,
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        int notify_id,
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const GURL& url,
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const GURL& first_party_for_cookies,
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const std::string& method,
135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                        const char* buf,
136d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                        unsigned int len,
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const GURL& referrer,
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        bool notify_redirects,
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        bool is_plugin_src_load,
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        int origin_pid,
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        int render_frame_id,
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        int render_view_id) OVERRIDE;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::PluginWindowHandle GetPluginWindowHandle();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::DeleteHelper<WebPluginDelegateProxy>;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebPluginDelegateProxy();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct SharedBitmap {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SharedBitmap();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~SharedBitmap();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<TransportDIB> dib;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<SkCanvas> canvas;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message handlers for messages that proxy WebPlugin methods, which
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we translate into calls to the real WebPlugin.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetWindow(gfx::PluginWindowHandle window);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCompleteURL(const std::string& url_in, std::string* url_out,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     bool* result);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnHandleURLRequest(const PluginHostMsg_URLRequest_Params& params);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCancelResource(int id);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnInvalidateRect(const gfx::Rect& rect);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetWindowScriptNPObject(int route_id, bool* success);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnResolveProxy(const GURL& url, bool* result, std::string* proxy_list);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetPluginElement(int route_id, bool* success);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetCookie(const GURL& url,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const GURL& first_party_for_cookies,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& cookie);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetCookies(const GURL& url, const GURL& first_party_for_cookies,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    std::string* cookies);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCancelDocumentLoad();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnInitiateHTTPRangeRequest(const std::string& url,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const std::string& range_info,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int range_request_id);
179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void OnDidStartLoading();
180d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void OnDidStopLoading();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDeferResourceLoading(unsigned long resource_id, bool defer);
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void OnURLRedirectResponse(bool allow, int resource_id);
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void OnCheckIfRunInsecureContent(const GURL& url, bool* result);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnFocusChanged(bool focused);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnStartIme();
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Accelerated (Core Animation) plugin implementation.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnAcceleratedPluginEnabledRendering();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnAcceleratedPluginAllocatedIOSurface(int32 width,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             int32 height,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             uint32 surface_id);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnAcceleratedPluginSwappedIOSurface();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN)
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void OnSetWindowlessData(HANDLE modal_loop_pump_messages_event,
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           gfx::NativeViewId dummy_activation_window);
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void OnNotifyIMEStatus(const int input_mode, const gfx::Rect& caret_rect);
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function that sends the UpdateGeometry message.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendUpdateGeometry(bool bitmaps_changed);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies the given rectangle from the back-buffer transport_stores_ bitmap to
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the front-buffer transport_stores_ bitmap.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CopyFromBackBufferToFrontBuffer(const gfx::Rect& rect);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates the front-buffer with the given rectangle from the back-buffer,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // either by copying the rectangle or flipping the buffers.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateFrontBuffer(const gfx::Rect& rect, bool allow_buffer_flipping);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears the shared memory section and canvases used for windowless plugins.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResetWindowlessBitmaps();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int front_buffer_index() const {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return front_buffer_index_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int back_buffer_index() const {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1 - front_buffer_index_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkCanvas* front_buffer_canvas() const {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return transport_stores_[front_buffer_index()].canvas.get();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkCanvas* back_buffer_canvas() const {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return transport_stores_[back_buffer_index()].canvas.get();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportDIB* front_buffer_dib() const {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return transport_stores_[front_buffer_index()].dib.get();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransportDIB* back_buffer_dib() const {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return transport_stores_[back_buffer_index()].dib.get();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a process-local memory section and canvas. PlatformCanvas on
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Windows only works with a DIB, not arbitrary memory.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateLocalBitmap(std::vector<uint8>* memory,
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         scoped_ptr<SkCanvas>* canvas);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a shared memory section and canvas.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateSharedBitmap(scoped_ptr<TransportDIB>* memory,
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          scoped_ptr<SkCanvas>* canvas);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called for cleanup during plugin destruction. Normally right before the
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // plugin window gets destroyed, or when the plugin has crashed (at which
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // point the window has already been destroyed).
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WillDestroyWindow();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if we should update the plugin geometry synchronously.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool UseSynchronousGeometryUpdates();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<RenderViewImpl> render_view_;
259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RenderFrameImpl* render_frame_;
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  WebPluginImpl* plugin_;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool uses_shared_bitmaps_;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool uses_compositor_;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for windowless plugins so that keyboard activation works.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::NativeViewId dummy_activation_window_;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::PluginWindowHandle window_;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginChannelHost> channel_host_;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mime_type_;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int instance_id_;
272ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebPluginInfo info_;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect plugin_rect_;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect clip_rect_;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObject* npobject_;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Dummy NPP used to uniquely identify this plugin.
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<NPP_t> npp_;
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Event passed in by the plugin process and is used to decide if messages
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to be pumped in the NPP_HandleEvent sync call.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::WaitableEvent> modal_loop_pump_messages_event_;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bitmap for crashed plugin
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap* sad_plugin_;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if we got an invalidate from the plugin and are waiting for a paint.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool invalidate_pending_;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the plugin is transparent or not.
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool transparent_;
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The index in the transport_stores_ array of the current front buffer
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (i.e., the buffer to display).
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int front_buffer_index_;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SharedBitmap transport_stores_[2];
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This lets us know the total portion of the transport store that has been
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // painted since the buffers were created.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect transport_store_painted_;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a bounding box on the portion of the front-buffer that was painted
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on the last buffer flip and which has not yet been re-painted in the
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // back-buffer.
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect front_buffer_diff_;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The url of the main frame hosting the plugin.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL page_url_;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebPluginDelegateProxy);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif  // CONTENT_RENDERER_NPAPI_WEBPLUGIN_DELEGATE_PROXY_H_
316