webplugin_impl.h revision f2477e01787aa58f445919b809d89e252beef54f
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_RENDERER_NPAPI_WEBPLUGIN_IMPL_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_RENDERER_NPAPI_WEBPLUGIN_IMPL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include <string> 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <vector> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/files/file_path.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/child/npapi/webplugin.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/webplugin_geometry.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLLoaderClient.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLRequest.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPlugin.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "url/gurl.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cc { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IOSurfaceLayer; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace blink { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebFrame; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebLayer; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebPluginContainer; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebURLResponse; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebURLLoader; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebURLRequest; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace webkit_glue { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MultipartResponseDelegate; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace webkit_glue 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewImpl; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebPluginDelegate; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the WebKit side of the plugin implementation that forwards calls, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after changing out of WebCore types, to a delegate. The delegate may 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be in a different process. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebPluginImpl : public WebPlugin, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public blink::WebPlugin, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public blink::WebURLLoaderClient { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebPluginImpl( 58b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) blink::WebFrame* frame, 59b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const blink::WebPluginParams& params, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file_path, 61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const base::WeakPtr<RenderViewImpl>& render_view); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~WebPluginImpl(); 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Helper function for sorting post data. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT static bool SetPostData(blink::WebURLRequest* request, 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char* buf, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 length); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blink::WebFrame* webframe() { return webframe_; } 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WebPluginDelegate* delegate() { return delegate_; } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // blink::WebPlugin methods: 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool initialize( 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch blink::WebPluginContainer* container); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void destroy(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NPObject* scriptableObject(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual struct _NPP* pluginNPP(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool getFormValue(blink::WebString& value); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void paint( 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blink::WebCanvas* canvas, const blink::WebRect& paint_rect); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void updateGeometry( 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const blink::WebRect& frame_rect, const blink::WebRect& clip_rect, 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebVector<blink::WebRect>& cut_outs, bool is_visible); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void updateFocus(bool focused); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void updateVisibility(bool visible); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool acceptsInputEvents(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool handleInputEvent( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const blink::WebInputEvent& event, blink::WebCursorInfo& cursor_info); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didReceiveResponse(const blink::WebURLResponse& response); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didReceiveData(const char* data, int data_length); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didFinishLoading(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didFailLoading(const blink::WebURLError& error); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didFinishLoadingFrameRequest( 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const blink::WebURL& url, void* notify_data); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didFailLoadingFrameRequest( 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const blink::WebURL& url, void* notify_data, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const blink::WebURLError& error); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool isPlaceholder() OVERRIDE; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebPlugin implementation: 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetWindow(gfx::PluginWindowHandle window) OVERRIDE; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetAcceptsInputEvents(bool accepts) OVERRIDE; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void WillDestroyWindow(gfx::PluginWindowHandle window) OVERRIDE; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CancelResource(unsigned long id) OVERRIDE; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Invalidate() OVERRIDE; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InvalidateRect(const gfx::Rect& rect) OVERRIDE; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NPObject* GetWindowScriptNPObject() OVERRIDE; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NPObject* GetPluginElement() OVERRIDE; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool FindProxyForUrl(const GURL& url, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* proxy_list) OVERRIDE; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetCookie(const GURL& url, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party_for_cookies, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie) OVERRIDE; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetCookies(const GURL& url, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party_for_cookies) OVERRIDE; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleURLRequest(const char* url, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *method, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* target, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* buf, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int len, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int notify_id, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool popups_allowed, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notify_redirects) OVERRIDE; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CancelDocumentLoad() OVERRIDE; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InitiateHTTPRangeRequest(const char* url, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* range_info, 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int pending_request_id) OVERRIDE; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidStartLoading() OVERRIDE; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidStopLoading() OVERRIDE; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsOffTheRecord() OVERRIDE; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetDeferResourceLoading(unsigned long resource_id, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool defer) OVERRIDE; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void URLRedirectResponse(bool allow, int resource_id) OVERRIDE; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CheckIfRunInsecureContent(const GURL& url) OVERRIDE; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetWindowlessData(HANDLE pump_messages_event, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeViewId dummy_activation_window) { } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReparentPluginWindow(HWND window, HWND parent) { } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportExecutableMemory(size_t size) { } 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual WebPluginAcceleratedSurface* GetAcceleratedSurface( 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::GpuPreference gpu_preference) OVERRIDE; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AcceleratedPluginEnabledRendering() OVERRIDE; 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AcceleratedPluginAllocatedIOSurface(int32 width, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 height, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 surface_id) OVERRIDE; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AcceleratedPluginSwappedIOSurface() OVERRIDE; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Given a (maybe partial) url, completes using the base url. 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL CompleteURL(const char* url); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum RoutingStatus { 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ROUTED, 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOT_ROUTED, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) INVALID_URL, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GENERAL_FAILURE 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Determines the referrer value sent along with outgoing HTTP requests 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // issued by plugins. 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum Referrer { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PLUGIN_SRC, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DOCUMENT_URL, 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NO_REFERRER 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Given a download request, check if we need to route the output to a frame. 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns ROUTED if the load is done and routed to a frame, NOT_ROUTED or 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // corresponding error codes otherwise. 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RoutingStatus RouteToFrame(const char* url, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_javascript_url, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool popups_allowed, 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* method, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* target, 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* buf, 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int len, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int notify_id, 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Referrer referrer_flag); 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the next avaiable resource id. Returns 0 if the operation fails. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It may fail if the page has already been closed. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long GetNextResourceId(); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initiates HTTP GET/POST requests. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true on success. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool InitiateHTTPRequest(unsigned long resource_id, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPluginResourceClient* client, 1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const GURL& url, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* method, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* buf, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* range_info, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer referrer_flag, 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notify_redirects, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool check_mixed_scripting); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect GetWindowClipRect(const gfx::Rect& rect); 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Sets the actual Widget for the plugin. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetContainer(blink::WebPluginContainer* container); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys the plugin instance. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The response_handle_to_ignore parameter if not NULL indicates the 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resource handle to be left valid during plugin shutdown. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TearDownPluginInstance(blink::WebURLLoader* loader_to_ignore); 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebURLLoaderClient implementation. We implement this interface in the 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer process, and then use the simple WebPluginResourceClient interface 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to relay the callbacks to the plugin. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void willSendRequest(blink::WebURLLoader* loader, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blink::WebURLRequest& request, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const blink::WebURLResponse& response); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didSendData(blink::WebURLLoader* loader, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long long bytes_sent, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long long total_bytes_to_be_sent); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didReceiveResponse(blink::WebURLLoader* loader, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const blink::WebURLResponse& response); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didReceiveData(blink::WebURLLoader* loader, const char *buffer, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int data_length, int encoded_data_length); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didFinishLoading(blink::WebURLLoader* loader, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double finishTime); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didFail(blink::WebURLLoader* loader, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const blink::WebURLError& error); 228 229 // Helper function to remove the stored information about a resource 230 // request given its index in m_clients. 231 void RemoveClient(size_t i); 232 233 // Helper function to remove the stored information about a resource 234 // request given a handle. 235 void RemoveClient(blink::WebURLLoader* loader); 236 237 // Handles HTTP multipart responses, i.e. responses received with a HTTP 238 // status code of 206. 239 // Returns false if response is not multipart (may be if we requested 240 // single range). 241 bool HandleHttpMultipartResponse(const blink::WebURLResponse& response, 242 WebPluginResourceClient* client); 243 244 void HandleURLRequestInternal(const char* url, 245 const char* method, 246 const char* target, 247 const char* buf, 248 unsigned int len, 249 int notify_id, 250 bool popups_allowed, 251 Referrer referrer_flag, 252 bool notify_redirects, 253 bool check_mixed_scripting); 254 255 // Tears down the existing plugin instance and creates a new plugin instance 256 // to handle the response identified by the loader parameter. 257 bool ReinitializePluginForResponse(blink::WebURLLoader* loader); 258 259 // Delayed task for downloading the plugin source URL. 260 void OnDownloadPluginSrcUrl(); 261 262 struct ClientInfo; 263 264 // Helper functions 265 WebPluginResourceClient* GetClientFromLoader(blink::WebURLLoader* loader); 266 ClientInfo* GetClientInfoFromLoader(blink::WebURLLoader* loader); 267 268 // Helper function to set the referrer on the request passed in. 269 void SetReferrer(blink::WebURLRequest* request, Referrer referrer_flag); 270 271 // Check for invalid chars like @, ;, \ before the first / (in path). 272 bool IsValidUrl(const GURL& url, Referrer referrer_flag); 273 274 WebPluginDelegate* CreatePluginDelegate(); 275 276 std::vector<ClientInfo> clients_; 277 278 bool windowless_; 279 gfx::PluginWindowHandle window_; 280#if defined(OS_MACOSX) 281 bool next_io_surface_allocated_; 282 int32 next_io_surface_width_; 283 int32 next_io_surface_height_; 284 uint32 next_io_surface_id_; 285 scoped_refptr<cc::IOSurfaceLayer> io_surface_layer_; 286 scoped_ptr<blink::WebLayer> web_layer_; 287#endif 288 bool accepts_input_events_; 289 base::WeakPtr<RenderViewImpl> render_view_; 290 blink::WebFrame* webframe_; 291 292 WebPluginDelegate* delegate_; 293 294 // This is just a weak reference. 295 blink::WebPluginContainer* container_; 296 297 // Unique identifier for this plugin, used to track script objects. 298 struct _NPP* npp_; 299 300 typedef std::map<WebPluginResourceClient*, 301 webkit_glue::MultipartResponseDelegate*> 302 MultiPartResponseHandlerMap; 303 // Tracks HTTP multipart response handlers instantiated for 304 // a WebPluginResourceClient instance. 305 MultiPartResponseHandlerMap multi_part_response_map_; 306 307 // The plugin source URL. 308 GURL plugin_url_; 309 310 // Indicates if the download would be initiated by the plugin or us. 311 bool load_manually_; 312 313 // Indicates if this is the first geometry update received by the plugin. 314 bool first_geometry_update_; 315 316 // Set to true if the next response error should be ignored. 317 bool ignore_response_error_; 318 319 // The current plugin geometry and clip rectangle. 320 WebPluginGeometry geometry_; 321 322 // The location of the plugin on disk. 323 base::FilePath file_path_; 324 325 // The mime type of the plugin. 326 std::string mime_type_; 327 328 // Holds the list of argument names and values passed to the plugin. We keep 329 // these so that we can re-initialize the plugin if we need to. 330 std::vector<std::string> arg_names_; 331 std::vector<std::string> arg_values_; 332 333 base::WeakPtrFactory<WebPluginImpl> weak_factory_; 334 335 DISALLOW_COPY_AND_ASSIGN(WebPluginImpl); 336}; 337 338} // namespace content 339 340#endif // CONTENT_RENDERER_NPAPI_WEBPLUGIN_IMPL_H_ 341