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