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_IMPL_H_ 6bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#define CONTENT_RENDERER_NPAPI_WEBPLUGIN_IMPL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/webplugin.h" 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/common/content_export.h" 18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/common/webplugin_geometry.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLLoaderClient.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLRequest.h" 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h" 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPlugin.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class IOSurfaceLayer; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebFrame; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (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) 41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace content { 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass MultipartResponseDelegate; 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class RenderFrameImpl; 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass RenderViewImpl; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class WebPluginDelegateProxy; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the WebKit side of the plugin implementation that forwards calls, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after changing out of WebCore types, to a delegate. The delegate may 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be in a different process. 50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass WebPluginImpl : public WebPlugin, 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public blink::WebPlugin { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPluginImpl( 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* frame, 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebPluginParams& params, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file_path, 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::WeakPtr<RenderViewImpl>& render_view, 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameImpl* render_frame); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WebPluginImpl(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function for sorting post data. 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CONTENT_EXPORT static bool SetPostData(blink::WebURLRequest* request, 63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const char* buf, 64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch uint32 length); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* webframe() { return webframe_; } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // blink::WebPlugin methods: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool initialize( 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPluginContainer* container); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void destroy(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NPObject* scriptableObject(); 7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual struct _NPP* pluginNPP(); 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool getFormValue(blink::WebString& value); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void paint( 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebCanvas* canvas, const blink::WebRect& paint_rect); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void updateGeometry( 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebRect& frame_rect, const blink::WebRect& clip_rect, 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebVector<blink::WebRect>& cut_outs, bool is_visible); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void updateFocus(bool focused); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void updateVisibility(bool visible); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool acceptsInputEvents(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool handleInputEvent( 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebInputEvent& event, blink::WebCursorInfo& cursor_info); 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void didReceiveResponse(const blink::WebURLResponse& response); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didReceiveData(const char* data, int data_length); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didFinishLoading(); 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void didFailLoading(const blink::WebURLError& error); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didFinishLoadingFrameRequest( 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& url, void* notify_data); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void didFailLoadingFrameRequest( 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURL& url, void* notify_data, 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLError& error); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool isPlaceholder() OVERRIDE; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebPlugin implementation: 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetWindow(gfx::PluginWindowHandle window) OVERRIDE; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetAcceptsInputEvents(bool accepts) OVERRIDE; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void WillDestroyWindow(gfx::PluginWindowHandle window) OVERRIDE; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CancelResource(unsigned long id) OVERRIDE; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Invalidate() OVERRIDE; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InvalidateRect(const gfx::Rect& rect) OVERRIDE; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NPObject* GetWindowScriptNPObject() OVERRIDE; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NPObject* GetPluginElement() OVERRIDE; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool FindProxyForUrl(const GURL& url, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* proxy_list) OVERRIDE; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetCookie(const GURL& url, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party_for_cookies, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie) OVERRIDE; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetCookies(const GURL& url, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party_for_cookies) OVERRIDE; 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void HandleURLRequest(const char* url, 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const char *method, 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const char* target, 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const char* buf, 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) unsigned int len, 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int notify_id, 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool popups_allowed, 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool notify_redirects) OVERRIDE; 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void CancelDocumentLoad() OVERRIDE; 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void InitiateHTTPRangeRequest(const char* url, 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const char* range_info, 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int pending_request_id) OVERRIDE; 124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void DidStartLoading() OVERRIDE; 125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void DidStopLoading() OVERRIDE; 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual bool IsOffTheRecord() OVERRIDE; 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SetDeferResourceLoading(unsigned long resource_id, 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool defer) OVERRIDE; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void URLRedirectResponse(bool allow, int resource_id) OVERRIDE; 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual bool CheckIfRunInsecureContent(const GURL& url) OVERRIDE; 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN) 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void SetWindowlessData(HANDLE pump_messages_event, 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::NativeViewId dummy_activation_window) { } 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ReparentPluginWindow(HWND window, HWND parent) { } 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ReportExecutableMemory(size_t size) { } 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebPluginAcceleratedSurface* GetAcceleratedSurface( 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::GpuPreference gpu_preference) OVERRIDE; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AcceleratedPluginEnabledRendering() OVERRIDE; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AcceleratedPluginAllocatedIOSurface(int32 width, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 height, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 surface_id) OVERRIDE; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AcceleratedPluginSwappedIOSurface() OVERRIDE; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Given a (maybe partial) url, completes using the base url. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL CompleteURL(const char* url); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum RoutingStatus { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ROUTED, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOT_ROUTED, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INVALID_URL, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GENERAL_FAILURE 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Determines the referrer value sent along with outgoing HTTP requests 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // issued by plugins. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Referrer { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PLUGIN_SRC, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DOCUMENT_URL, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_REFERRER 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Given a download request, check if we need to route the output to a frame. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns ROUTED if the load is done and routed to a frame, NOT_ROUTED or 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // corresponding error codes otherwise. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RoutingStatus RouteToFrame(const char* url, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_javascript_url, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool popups_allowed, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* method, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* target, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* buf, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int len, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int notify_id, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer referrer_flag); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the next avaiable resource id. Returns 0 if the operation fails. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It may fail if the page has already been closed. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long GetNextResourceId(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initiates HTTP GET/POST requests. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true on success. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool InitiateHTTPRequest(unsigned long resource_id, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPluginResourceClient* client, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* method, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* buf, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* range_info, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer referrer_flag, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notify_redirects, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool check_mixed_scripting); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect GetWindowClipRect(const gfx::Rect& rect); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the actual Widget for the plugin. 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetContainer(blink::WebPluginContainer* container); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys the plugin instance. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The response_handle_to_ignore parameter if not NULL indicates the 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resource handle to be left valid during plugin shutdown. 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void TearDownPluginInstance(blink::WebURLLoader* loader_to_ignore); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebURLLoaderClient implementation. We implement this interface in the 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer process, and then use the simple WebPluginResourceClient interface 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to relay the callbacks to the plugin. 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void willSendRequest(blink::WebURLLoader* loader, 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blink::WebURLRequest& request, 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebURLResponse& response); 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void didSendData(blink::WebURLLoader* loader, 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned long long bytes_sent, 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned long long total_bytes_to_be_sent); 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void didReceiveResponse(blink::WebURLLoader* loader, 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& response); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void didReceiveData(blink::WebURLLoader* loader, const char *buffer, 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int data_length, int encoded_data_length); 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void didFinishLoading(blink::WebURLLoader* loader, 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double finishTime); 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void didFail(blink::WebURLLoader* loader, 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebURLError& error); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function to remove the stored information about a resource 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // request given its index in m_clients. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveClient(size_t i); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function to remove the stored information about a resource 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // request given a handle. 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void RemoveClient(blink::WebURLLoader* loader); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles HTTP multipart responses, i.e. responses received with a HTTP 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // status code of 206. 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns false if response is not multipart (may be if we requested 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // single range). 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool HandleHttpMultipartResponse(const blink::WebURLResponse& response, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPluginResourceClient* client); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleURLRequestInternal(const char* url, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* method, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* target, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* buf, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int len, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int notify_id, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool popups_allowed, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer referrer_flag, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notify_redirects, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool check_mixed_scripting); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tears down the existing plugin instance and creates a new plugin instance 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to handle the response identified by the loader parameter. 253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool ReinitializePluginForResponse(blink::WebURLLoader* loader); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delayed task for downloading the plugin source URL. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDownloadPluginSrcUrl(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ClientInfo; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper functions 261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WebPluginResourceClient* GetClientFromLoader(blink::WebURLLoader* loader); 262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ClientInfo* GetClientInfoFromLoader(blink::WebURLLoader* loader); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function to set the referrer on the request passed in. 265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetReferrer(blink::WebURLRequest* request, Referrer referrer_flag); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check for invalid chars like @, ;, \ before the first / (in path). 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsValidUrl(const GURL& url, Referrer referrer_flag); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ClientInfo> clients_; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool windowless_; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::PluginWindowHandle window_; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool next_io_surface_allocated_; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 next_io_surface_width_; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 next_io_surface_height_; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 next_io_surface_id_; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<cc::IOSurfaceLayer> io_surface_layer_; 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<blink::WebLayer> web_layer_; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool accepts_input_events_; 283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameImpl* render_frame_; 284ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::WeakPtr<RenderViewImpl> render_view_; 285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFrame* webframe_; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebPluginDelegateProxy* delegate_; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is just a weak reference. 290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPluginContainer* container_; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Unique identifier for this plugin, used to track script objects. 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) struct _NPP* npp_; 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef std::map<WebPluginResourceClient*, MultipartResponseDelegate*> 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultiPartResponseHandlerMap; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tracks HTTP multipart response handlers instantiated for 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a WebPluginResourceClient instance. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MultiPartResponseHandlerMap multi_part_response_map_; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The plugin source URL. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL plugin_url_; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates if the download would be initiated by the plugin or us. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool load_manually_; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates if this is the first geometry update received by the plugin. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool first_geometry_update_; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set to true if the next response error should be ignored. 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ignore_response_error_; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current plugin geometry and clip rectangle. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPluginGeometry geometry_; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The location of the plugin on disk. 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path_; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The mime type of the plugin. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mime_type_; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Holds the list of argument names and values passed to the plugin. We keep 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // these so that we can re-initialize the plugin if we need to. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> arg_names_; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> arg_values_; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class LoaderClient : public blink::WebURLLoaderClient { 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoaderClient(WebPluginImpl*); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void willSendRequest(blink::WebURLLoader*, 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blink::WebURLRequest&, 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebURLResponse&) OVERRIDE; 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void didSendData(blink::WebURLLoader*, 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned long long bytesSent, 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned long long totalBytesToBeSent) OVERRIDE; 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void didReceiveResponse(blink::WebURLLoader*, 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebURLResponse&) OVERRIDE; 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void didDownloadData(blink::WebURLLoader*, 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int dataLength, 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int encodedDataLength) OVERRIDE; 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void didReceiveData(blink::WebURLLoader*, 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* data, 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int dataLength, 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int encodedDataLength) OVERRIDE; 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void didReceiveCachedMetadata(blink::WebURLLoader*, 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* data, 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int dataLength) OVERRIDE; 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void didFinishLoading(blink::WebURLLoader*, 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) double finishTime, 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64_t total_encoded_data_length) OVERRIDE; 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void didFail(blink::WebURLLoader*, 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebURLError&) OVERRIDE; 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebPluginImpl* parent_; 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoaderClient loader_client_; 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::WeakPtrFactory<WebPluginImpl> weak_factory_; 3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebPluginImpl); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 366ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace content 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 368bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // CONTENT_RENDERER_NPAPI_WEBPLUGIN_IMPL_H_ 369