blob: 47f3ab24e39f5404bfc8f4b7afb8fd7af697a18c [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_PLUGIN_WEBPLUGIN_PROXY_H_
#define CONTENT_PLUGIN_WEBPLUGIN_PROXY_H_
#pragma once
#include <string>
#include "base/hash_tables.h"
#include "base/memory/ref_counted.h"
#if defined(OS_MACOSX)
#include "base/mac/scoped_cftyperef.h"
#endif
#include "base/memory/scoped_handle.h"
#include "base/memory/scoped_ptr.h"
#include "base/shared_memory.h"
#include "base/timer.h"
#include "googleurl/src/gurl.h"
#include "ipc/ipc_message.h"
#if defined(USE_X11)
#include "ui/base/x/x11_util.h"
#endif
#include "ui/gfx/surface/transport_dib.h"
#include "webkit/plugins/npapi/webplugin.h"
class PluginChannel;
namespace webkit {
namespace npapi {
class WebPluginDelegateImpl;
}
}
#if defined(OS_MACOSX)
class WebPluginAcceleratedSurfaceProxy;
#endif
// This is an implementation of WebPlugin that proxies all calls to the
// renderer.
class WebPluginProxy : public webkit::npapi::WebPlugin {
public:
// Creates a new proxy for WebPlugin, using the given sender to send the
// marshalled WebPlugin calls.
WebPluginProxy(PluginChannel* channel,
int route_id,
const GURL& page_url,
gfx::NativeViewId containing_window,
int host_render_view_routing_id);
~WebPluginProxy();
void set_delegate(webkit::npapi::WebPluginDelegateImpl* d) { delegate_ = d; }
// WebPlugin overrides
virtual void SetWindow(gfx::PluginWindowHandle window);
// Whether input events should be sent to the delegate.
virtual void SetAcceptsInputEvents(bool accepts);
virtual void WillDestroyWindow(gfx::PluginWindowHandle window);
#if defined(OS_WIN)
void SetWindowlessPumpEvent(HANDLE pump_messages_event);
#endif
virtual void CancelResource(unsigned long id);
virtual void Invalidate();
virtual void InvalidateRect(const gfx::Rect& rect);
virtual NPObject* GetWindowScriptNPObject();
virtual NPObject* GetPluginElement();
virtual void SetCookie(const GURL& url,
const GURL& first_party_for_cookies,
const std::string& cookie);
virtual std::string GetCookies(const GURL& url,
const GURL& first_party_for_cookies);
virtual void OnMissingPluginStatus(int status);
// class-specific methods
// Returns a WebPluginResourceClient object given its id, or NULL if no
// object with that id exists.
webkit::npapi::WebPluginResourceClient* GetResourceClient(int id);
// Returns the id of the renderer that contains this plugin.
int GetRendererId();
// Returns the id of the associated render view.
int host_render_view_routing_id() const {
return host_render_view_routing_id_;
}
// For windowless plugins, paints the given rectangle into the local buffer.
void Paint(const gfx::Rect& rect);
// Callback from the renderer to let us know that a paint occurred.
void DidPaint();
// Notification received on a plugin issued resource request creation.
void OnResourceCreated(int resource_id,
webkit::npapi::WebPluginResourceClient* client);
virtual void HandleURLRequest(const char* url,
const char* method,
const char* target,
const char* buf,
unsigned int len,
int notify_id,
bool popups_allowed,
bool notify_redirects);
void UpdateGeometry(const gfx::Rect& window_rect,
const gfx::Rect& clip_rect,
const TransportDIB::Handle& windowless_buffer,
const TransportDIB::Handle& background_buffer,
bool transparent
#if defined(OS_MACOSX)
,
int ack_key
#endif
);
virtual void CancelDocumentLoad();
virtual void InitiateHTTPRangeRequest(
const char* url, const char* range_info, int range_request_id);
virtual void SetDeferResourceLoading(unsigned long resource_id, bool defer);
virtual bool IsOffTheRecord();
virtual void ResourceClientDeleted(
webkit::npapi::WebPluginResourceClient* resource_client);
gfx::NativeViewId containing_window() { return containing_window_; }
#if defined(OS_MACOSX)
virtual void FocusChanged(bool focused);
virtual void StartIme();
virtual void BindFakePluginWindowHandle(bool opaque);
virtual webkit::npapi::WebPluginAcceleratedSurface* GetAcceleratedSurface();
// Tell the browser (via the renderer) to invalidate because the
// accelerated buffers have changed.
virtual void AcceleratedFrameBuffersDidSwap(
gfx::PluginWindowHandle window, uint64 surface_id);
// Tell the renderer and browser to associate the given plugin handle with
// |accelerated_surface_identifier|. The geometry is used to resize any
// native "window" (which on the Mac is a just a view).
// This method is used when IOSurface support is available.
virtual void SetAcceleratedSurface(gfx::PluginWindowHandle window,
const gfx::Size& size,
uint64 accelerated_surface_identifier);
// Tell the renderer and browser to associate the given plugin handle with
// |dib_handle|. The geometry is used to resize any native "window" (which
// on the Mac is just a view).
// This method is used when IOSurface support is not available.
virtual void SetAcceleratedDIB(
gfx::PluginWindowHandle window,
const gfx::Size& size,
const TransportDIB::Handle& dib_handle);
// Create/destroy TranportDIBs via messages to the browser process.
// These are only used when IOSurface support is not available.
virtual void AllocSurfaceDIB(const size_t size,
TransportDIB::Handle* dib_handle);
virtual void FreeSurfaceDIB(TransportDIB::Id dib_id);
#endif
virtual void URLRedirectResponse(bool allow, int resource_id);
private:
bool Send(IPC::Message* msg);
// Handler for sending over the paint event to the plugin.
void OnPaint(const gfx::Rect& damaged_rect);
// Updates the shared memory section where windowless plugins paint.
void SetWindowlessBuffer(const TransportDIB::Handle& windowless_buffer,
const TransportDIB::Handle& background_buffer,
const gfx::Rect& window_rect);
typedef base::hash_map<int, webkit::npapi::WebPluginResourceClient*>
ResourceClientMap;
ResourceClientMap resource_clients_;
scoped_refptr<PluginChannel> channel_;
int route_id_;
NPObject* window_npobject_;
NPObject* plugin_element_;
webkit::npapi::WebPluginDelegateImpl* delegate_;
gfx::Rect damaged_rect_;
bool waiting_for_paint_;
gfx::NativeViewId containing_window_;
// The url of the main frame hosting the plugin.
GURL page_url_;
// Variables used for desynchronized windowless plugin painting. See note in
// webplugin_delegate_proxy.h for how this works.
bool transparent_;
#if defined(OS_MACOSX)
scoped_ptr<TransportDIB> windowless_dib_;
scoped_ptr<TransportDIB> background_dib_;
base::mac::ScopedCFTypeRef<CGContextRef> windowless_context_;
base::mac::ScopedCFTypeRef<CGContextRef> background_context_;
scoped_ptr<WebPluginAcceleratedSurfaceProxy> accelerated_surface_;
#else
scoped_ptr<skia::PlatformCanvas> windowless_canvas_;
scoped_ptr<skia::PlatformCanvas> background_canvas_;
#if defined(USE_X11)
scoped_ptr<TransportDIB> windowless_dib_;
scoped_ptr<TransportDIB> background_dib_;
// If we can use SHM pixmaps for windowless plugin painting or not.
bool use_shm_pixmap_;
// The SHM pixmap for windowless plugin painting.
XID windowless_shm_pixmap_;
#endif
#endif
// Contains the routing id of the host render view.
int host_render_view_routing_id_;
ScopedRunnableMethodFactory<WebPluginProxy> runnable_method_factory_;
};
#endif // CONTENT_PLUGIN_WEBPLUGIN_PROXY_H_