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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_PLUGIN_WEBPLUGIN_PROXY_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_PLUGIN_WEBPLUGIN_PROXY_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_cftyperef.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_handle.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/memory/shared_memory.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/webplugin.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/refptr.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h"
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/x/x11_util.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gpu_preference.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/surface/transport_dib.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginChannel;
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass WebPluginDelegateImpl;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebPluginAcceleratedSurfaceProxy;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is an implementation of WebPlugin that proxies all calls to the
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// renderer.
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass WebPluginProxy : public WebPlugin {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a new proxy for WebPlugin, using the given sender to send the
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // marshalled WebPlugin calls.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebPluginProxy(PluginChannel* channel,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 int route_id,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 const GURL& page_url,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 int host_render_view_routing_id);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebPluginProxy();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void set_delegate(WebPluginDelegateImpl* d) { delegate_ = d; }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebPlugin overrides
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetWindow(gfx::PluginWindowHandle window) OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether input events should be sent to the delegate.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetAcceptsInputEvents(bool accepts) OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void WillDestroyWindow(gfx::PluginWindowHandle window) OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetWindowlessData(HANDLE pump_messages_event,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         gfx::NativeViewId dummy_activation_window);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CancelResource(unsigned long id) OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Invalidate() OVERRIDE;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InvalidateRect(const gfx::Rect& rect) OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual NPObject* GetWindowScriptNPObject() OVERRIDE;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual NPObject* GetPluginElement() OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool FindProxyForUrl(const GURL& url,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               std::string* proxy_list) OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetCookie(const GURL& url,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const GURL& first_party_for_cookies,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const std::string& cookie) OVERRIDE;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetCookies(const GURL& url,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const GURL& first_party_for_cookies) OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // class-specific methods
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a WebPluginResourceClient object given its id, or NULL if no
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // object with that id exists.
82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebPluginResourceClient* GetResourceClient(int id);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the id of the renderer that contains this plugin.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetRendererId();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the id of the associated render view.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int host_render_view_routing_id() const {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return host_render_view_routing_id_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For windowless plugins, paints the given rectangle into the local buffer.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Paint(const gfx::Rect& rect);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback from the renderer to let us know that a paint occurred.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidPaint();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notification received on a plugin issued resource request creation.
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void OnResourceCreated(int resource_id, WebPluginResourceClient* client);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void HandleURLRequest(const char* url,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const char* method,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const char* target,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const char* buf,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                unsigned int len,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int notify_id,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                bool popups_allowed,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                bool notify_redirects) OVERRIDE;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateGeometry(const gfx::Rect& window_rect,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const gfx::Rect& clip_rect,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const TransportDIB::Handle& windowless_buffer0,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const TransportDIB::Handle& windowless_buffer1,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int windowless_buffer_index);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CancelDocumentLoad() OVERRIDE;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InitiateHTTPRangeRequest(
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char* url, const char* range_info, int range_request_id) OVERRIDE;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetDeferResourceLoading(unsigned long resource_id,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool defer) OVERRIDE;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsOffTheRecord() OVERRIDE;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ResourceClientDeleted(
121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      WebPluginResourceClient* resource_client) OVERRIDE;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void FocusChanged(bool focused) OVERRIDE;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartIme() OVERRIDE;
126ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual WebPluginAcceleratedSurface*
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetAcceleratedSurface(gfx::GpuPreference gpu_preference) OVERRIDE;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //----------------------------------------------------------------------
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Accelerated plugin implementation which renders via the compositor.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tells the renderer, and from there the GPU process, that the plugin
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is using accelerated rather than software rendering.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AcceleratedPluginEnabledRendering() OVERRIDE;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tells the renderer, and from there the GPU process, that the plugin
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // allocated the given IOSurface to be used as its backing store.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AcceleratedPluginAllocatedIOSurface(int32 width,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   int32 height,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   uint32 surface_id) OVERRIDE;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AcceleratedPluginSwappedIOSurface() OVERRIDE;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void URLRedirectResponse(bool allow, int resource_id) OVERRIDE;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieves the IME status from a windowless plug-in and sends it to a
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // renderer process. A renderer process will convert the coordinates from
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // local to the window coordinates and send the converted coordinates to a
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser process.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateIMEStatus();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class SharedTransportDIB : public base::RefCounted<SharedTransportDIB> {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit SharedTransportDIB(TransportDIB* dib);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TransportDIB* dib() { return dib_.get(); }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class base::RefCounted<SharedTransportDIB>;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~SharedTransportDIB();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<TransportDIB> dib_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Send(IPC::Message* msg);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handler for sending over the paint event to the plugin.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPaint(const gfx::Rect& damaged_rect);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateCanvasFromHandle(const TransportDIB::Handle& dib_handle,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::Rect& window_rect,
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              skia::RefPtr<SkCanvas>* canvas);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CreateDIBAndCGContextFromHandle(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const TransportDIB::Handle& dib_handle,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Rect& window_rect,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<TransportDIB>* dib_out,
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::ScopedCFTypeRef<CGContextRef>* cg_context_out);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CreateDIBAndCanvasFromHandle(
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const TransportDIB::Handle& dib_handle,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Rect& window_rect,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<SharedTransportDIB>* dib_out,
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::RefPtr<SkCanvas>* canvas);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CreateShmPixmapFromDIB(
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TransportDIB* dib,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Rect& window_rect,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      XID* pixmap_out);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates the shared memory sections where windowless plugins paint.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetWindowlessBuffers(const TransportDIB::Handle& windowless_buffer0,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const TransportDIB::Handle& windowless_buffer1,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const gfx::Rect& window_rect);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CGContextRef windowless_context() const {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return windowless_contexts_[windowless_buffer_index_].get();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skia::RefPtr<SkCanvas> windowless_canvas() const {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return windowless_canvases_[windowless_buffer_index_];
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XID windowless_shm_pixmap() const {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return windowless_shm_pixmaps_[windowless_buffer_index_];
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
216ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  typedef base::hash_map<int, WebPluginResourceClient*> ResourceClientMap;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceClientMap resource_clients_;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginChannel> channel_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int route_id_;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObject* window_npobject_;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NPObject* plugin_element_;
223ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebPluginDelegateImpl* delegate_;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect damaged_rect_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_for_paint_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The url of the main frame hosting the plugin.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL page_url_;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Variables used for desynchronized windowless plugin painting. See note in
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // webplugin_delegate_proxy.h for how this works. The two sets of windowless_*
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fields are for the front-buffer and back-buffer of a buffer flipping system
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and windowless_buffer_index_ identifies which set we are using as the
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // back-buffer at any given time.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int windowless_buffer_index_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TransportDIB> windowless_dibs_[2];
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::ScopedCFTypeRef<CGContextRef> windowless_contexts_[2];
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WebPluginAcceleratedSurfaceProxy> accelerated_surface_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  skia::RefPtr<SkCanvas> windowless_canvases_[2];
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SharedTransportDIB> windowless_dibs_[2];
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we can use SHM pixmaps for windowless plugin painting or not.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool use_shm_pixmap_;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The SHM pixmaps for windowless plugin painting.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XID windowless_shm_pixmaps_[2];
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains the routing id of the host render view.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int host_render_view_routing_id_;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<WebPluginProxy> weak_factory_;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_PLUGIN_WEBPLUGIN_PROXY_H_
261