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