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