dom/plugins/base/nsPluginInstanceOwner.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 // vim:set ts=2 sts=2 sw=2 et cin:
     3 /* This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 #ifndef nsPluginInstanceOwner_h_
     8 #define nsPluginInstanceOwner_h_
    10 #include "mozilla/Attributes.h"
    11 #include "npapi.h"
    12 #include "nsCOMPtr.h"
    13 #include "nsIPluginInstanceOwner.h"
    14 #include "nsIPrivacyTransitionObserver.h"
    15 #include "nsIDOMEventListener.h"
    16 #include "nsPluginHost.h"
    17 #include "nsPluginNativeWindow.h"
    18 #include "nsWeakReference.h"
    19 #include "gfxRect.h"
    21 #ifdef XP_MACOSX
    22 #include "mozilla/gfx/QuartzSupport.h"
    23 #include <ApplicationServices/ApplicationServices.h>
    24 #endif
    26 class nsIInputStream;
    27 struct nsIntRect;
    28 class nsPluginDOMContextMenuListener;
    29 class nsObjectFrame;
    30 class nsDisplayListBuilder;
    32 #ifdef MOZ_X11
    33 class gfxXlibSurface;
    34 #ifdef MOZ_WIDGET_QT
    35 #include "gfxQtNativeRenderer.h"
    36 #else
    37 #include "gfxXlibNativeRenderer.h"
    38 #endif
    39 #endif
    41 class nsPluginInstanceOwner : public nsIPluginInstanceOwner,
    42                               public nsIDOMEventListener,
    43                               public nsIPrivacyTransitionObserver,
    44                               public nsSupportsWeakReference
    45 {
    46 public:
    47   nsPluginInstanceOwner();
    48   virtual ~nsPluginInstanceOwner();
    50   NS_DECL_ISUPPORTS
    51   NS_DECL_NSIPLUGININSTANCEOWNER
    52   NS_DECL_NSIPRIVACYTRANSITIONOBSERVER
    54   NS_IMETHOD GetURL(const char *aURL, const char *aTarget,
    55                     nsIInputStream *aPostStream, 
    56                     void *aHeadersData, uint32_t aHeadersDataLen) MOZ_OVERRIDE;
    58   NS_IMETHOD ShowStatus(const char16_t *aStatusMsg) MOZ_OVERRIDE;
    60   NPError    ShowNativeContextMenu(NPMenu* menu, void* event) MOZ_OVERRIDE;
    62   NPBool     ConvertPoint(double sourceX, double sourceY, NPCoordinateSpace sourceSpace,
    63                           double *destX, double *destY, NPCoordinateSpace destSpace) MOZ_OVERRIDE;
    65   virtual NPError InitAsyncSurface(NPSize *size, NPImageFormat format,
    66                                    void *initData, NPAsyncSurface *surface) MOZ_OVERRIDE;
    67   virtual NPError FinalizeAsyncSurface(NPAsyncSurface *surface) MOZ_OVERRIDE;
    68   virtual void SetCurrentAsyncSurface(NPAsyncSurface *surface, NPRect *changed) MOZ_OVERRIDE;
    70   /**
    71    * Get the type of the HTML tag that was used ot instantiate this
    72    * plugin.  Currently supported tags are EMBED, OBJECT and APPLET.
    73    */
    74   NS_IMETHOD GetTagType(nsPluginTagType *aResult);
    76   /**
    77    * Get a ptr to the paired list of parameter names and values,
    78    * returns the length of the array.
    79    *
    80    * Each name or value is a null-terminated string.
    81    */
    82   NS_IMETHOD GetParameters(uint16_t& aCount,
    83                            const char*const*& aNames,
    84                            const char*const*& aValues);
    86   /**
    87    * Get the value for the named parameter.  Returns null
    88    * if the parameter was not set.
    89    *
    90    * @param aName   - name of the parameter
    91    * @param aResult - parameter value
    92    * @result        - NS_OK if this operation was successful
    93    */
    94   NS_IMETHOD GetParameter(const char* aName, const char* *aResult);
    96   /**
    97    * QueryInterface on nsIPluginInstancePeer to get this.
    98    *
    99    * (Corresponds to NPP_New's argc, argn, and argv arguments.)
   100    * Get a ptr to the paired list of attribute names and values,
   101    * returns the length of the array.
   102    *
   103    * Each name or value is a null-terminated string.
   104    */
   105   NS_IMETHOD GetAttributes(uint16_t& aCount,
   106                            const char*const*& aNames,
   107                            const char*const*& aValues);
   110   /**
   111    * Gets the value for the named attribute.
   112    *
   113    * @param aName   - the name of the attribute to find
   114    * @param aResult - the resulting attribute
   115    * @result - NS_OK if this operation was successful, NS_ERROR_FAILURE if
   116    * this operation failed. result is set to NULL if the attribute is not found
   117    * else to the found value.
   118    */
   119   NS_IMETHOD GetAttribute(const char* aName, const char* *aResult);
   121   /**
   122    * Returns the DOM element corresponding to the tag which references
   123    * this plugin in the document.
   124    *
   125    * @param aDOMElement - resulting DOM element
   126    * @result - NS_OK if this operation was successful
   127    */
   128   NS_IMETHOD GetDOMElement(nsIDOMElement* * aResult);
   130   // nsIDOMEventListener interfaces 
   131   NS_DECL_NSIDOMEVENTLISTENER
   133   nsresult ProcessMouseDown(nsIDOMEvent* aKeyEvent);
   134   nsresult ProcessKeyPress(nsIDOMEvent* aKeyEvent);
   135   nsresult Destroy();  
   137 #ifdef XP_WIN
   138   void Paint(const RECT& aDirty, HDC aDC);
   139 #elif defined(XP_MACOSX)
   140   void Paint(const gfxRect& aDirtyRect, CGContextRef cgContext);  
   141   void RenderCoreAnimation(CGContextRef aCGContext, int aWidth, int aHeight);
   142   void DoCocoaEventDrawRect(const gfxRect& aDrawRect, CGContextRef cgContext);
   143 #elif defined(MOZ_X11) || defined(ANDROID)
   144   void Paint(gfxContext* aContext,
   145              const gfxRect& aFrameRect,
   146              const gfxRect& aDirtyRect);
   147 #endif
   149   //locals
   151   nsresult Init(nsIContent* aContent);
   153   void* GetPluginPortFromWidget();
   154   void ReleasePluginPort(void* pluginPort);
   156   nsEventStatus ProcessEvent(const mozilla::WidgetGUIEvent& anEvent);
   158 #ifdef XP_MACOSX
   159   enum { ePluginPaintEnable, ePluginPaintDisable };
   161   NPDrawingModel GetDrawingModel();
   162   bool IsRemoteDrawingCoreAnimation();
   163   nsresult ContentsScaleFactorChanged(double aContentsScaleFactor);
   164   NPEventModel GetEventModel();
   165   static void CARefresh(nsITimer *aTimer, void *aClosure);
   166   void AddToCARefreshTimer();
   167   void RemoveFromCARefreshTimer();
   168   // This calls into the plugin (NPP_SetWindow) and can run script.
   169   void* FixUpPluginWindow(int32_t inPaintState);
   170   void HidePluginWindow();
   171   // Set a flag that (if true) indicates the plugin port info has changed and
   172   // SetWindow() needs to be called.
   173   void SetPluginPortChanged(bool aState) { mPluginPortChanged = aState; }
   174   // Return a pointer to the internal nsPluginPort structure that's used to
   175   // store a copy of plugin port info and to detect when it's been changed.
   176   void* GetPluginPortCopy();
   177   // Set plugin port info in the plugin (in the 'window' member of the
   178   // NPWindow structure passed to the plugin by SetWindow()) and set a
   179   // flag (mPluginPortChanged) to indicate whether or not this info has
   180   // changed, and SetWindow() needs to be called again.
   181   void* SetPluginPortAndDetectChange();
   182   // Flag when we've set up a Thebes (and CoreGraphics) context in
   183   // nsObjectFrame::PaintPlugin().  We need to know this in
   184   // FixUpPluginWindow() (i.e. we need to know when FixUpPluginWindow() has
   185   // been called from nsObjectFrame::PaintPlugin() when we're using the
   186   // CoreGraphics drawing model).
   187   void BeginCGPaint();
   188   void EndCGPaint();
   189 #else // XP_MACOSX
   190   void UpdateWindowPositionAndClipRect(bool aSetWindow);
   191   void UpdateWindowVisibility(bool aVisible);
   192   void UpdateDocumentActiveState(bool aIsActive);
   193 #endif // XP_MACOSX
   195   void SetFrame(nsObjectFrame *aFrame);
   196   nsObjectFrame* GetFrame();
   198   uint32_t GetLastEventloopNestingLevel() const {
   199     return mLastEventloopNestingLevel; 
   200   }
   202   static uint32_t GetEventloopNestingLevel();
   204   void ConsiderNewEventloopNestingLevel() {
   205     uint32_t currentLevel = GetEventloopNestingLevel();
   207     if (currentLevel < mLastEventloopNestingLevel) {
   208       mLastEventloopNestingLevel = currentLevel;
   209     }
   210   }
   212   const char* GetPluginName()
   213   {
   214     if (mInstance && mPluginHost) {
   215       const char* name = nullptr;
   216       if (NS_SUCCEEDED(mPluginHost->GetPluginName(mInstance, &name)) && name)
   217         return name;
   218     }
   219     return "";
   220   }
   222 #ifdef MOZ_X11
   223   void GetPluginDescription(nsACString& aDescription)
   224   {
   225     aDescription.Truncate();
   226     if (mInstance && mPluginHost) {
   227       nsCOMPtr<nsIPluginTag> pluginTag;
   229       mPluginHost->GetPluginTagForInstance(mInstance,
   230                                            getter_AddRefs(pluginTag));
   231       if (pluginTag) {
   232         pluginTag->GetDescription(aDescription);
   233       }
   234     }
   235   }
   236 #endif
   238   bool SendNativeEvents()
   239   {
   240 #ifdef XP_WIN
   241     // XXX we should remove the plugin name check
   242     return mPluginWindow->type == NPWindowTypeDrawable &&
   243     (MatchPluginName("Shockwave Flash") ||
   244      MatchPluginName("Test Plug-in"));
   245 #elif defined(MOZ_X11) || defined(XP_MACOSX)
   246     return true;
   247 #else
   248     return false;
   249 #endif
   250   }
   252   bool MatchPluginName(const char *aPluginName)
   253   {
   254     return strncmp(GetPluginName(), aPluginName, strlen(aPluginName)) == 0;
   255   }
   257   void NotifyPaintWaiter(nsDisplayListBuilder* aBuilder);
   259   // Returns the image container that has our currently displayed image.
   260   already_AddRefed<mozilla::layers::ImageContainer> GetImageContainer();
   262   /**
   263    * Returns the bounds of the current async-rendered surface. This can only
   264    * change in response to messages received by the event loop (i.e. not during
   265    * painting).
   266    */
   267   nsIntSize GetCurrentImageSize();
   269   // Methods to update the background image we send to async plugins.
   270   // The eventual target of these operations is PluginInstanceParent,
   271   // but it takes several hops to get there.
   272   void SetBackgroundUnknown();
   273   already_AddRefed<gfxContext> BeginUpdateBackground(const nsIntRect& aRect);
   274   void EndUpdateBackground(gfxContext* aContext, const nsIntRect& aRect);
   276   bool UseAsyncRendering();
   278   already_AddRefed<nsIURI> GetBaseURI() const;
   280 #ifdef MOZ_WIDGET_ANDROID
   281   // Returns the image container for the specified VideoInfo
   282   void GetVideos(nsTArray<nsNPAPIPluginInstance::VideoInfo*>& aVideos);
   283   already_AddRefed<mozilla::layers::ImageContainer> GetImageContainerForVideo(nsNPAPIPluginInstance::VideoInfo* aVideoInfo);
   285   void Invalidate();
   287   void RequestFullScreen();
   288   void ExitFullScreen();
   290   // Called from AndroidJNI when we removed the fullscreen view.
   291   static void ExitFullScreen(jobject view);
   292 #endif
   294 private:
   296   // return FALSE if LayerSurface dirty (newly created and don't have valid plugin content yet)
   297   bool IsUpToDate()
   298   {
   299     nsIntSize size;
   300     return NS_SUCCEEDED(mInstance->GetImageSize(&size)) &&
   301     size == nsIntSize(mPluginWindow->width, mPluginWindow->height);
   302   }
   304   void FixUpURLS(const nsString &name, nsAString &value);
   305 #ifdef MOZ_WIDGET_ANDROID
   306   mozilla::LayoutDeviceRect GetPluginRect();
   307   bool AddPluginView(const mozilla::LayoutDeviceRect& aRect = mozilla::LayoutDeviceRect(0, 0, 0, 0));
   308   void RemovePluginView();
   310   bool mFullScreen;
   311   void* mJavaView;
   312 #endif 
   314   nsPluginNativeWindow       *mPluginWindow;
   315   nsRefPtr<nsNPAPIPluginInstance> mInstance;
   316   nsObjectFrame              *mObjectFrame;
   317   nsIContent                 *mContent; // WEAK, content owns us
   318   nsCString                   mDocumentBase;
   319   bool                        mWidgetCreationComplete;
   320   nsCOMPtr<nsIWidget>         mWidget;
   321   nsRefPtr<nsPluginHost>      mPluginHost;
   323 #ifdef XP_MACOSX
   324   NP_CGContext                              mCGPluginPortCopy;
   325   int32_t                                   mInCGPaintLevel;
   326   mozilla::RefPtr<MacIOSurface>             mIOSurface;
   327   mozilla::RefPtr<nsCARenderer>             mCARenderer;
   328   CGColorSpaceRef                           mColorProfile;
   329   static nsCOMPtr<nsITimer>                *sCATimer;
   330   static nsTArray<nsPluginInstanceOwner*>  *sCARefreshListeners;
   331   bool                                      mSentInitialTopLevelWindowEvent;
   332 #endif
   334   // Initially, the event loop nesting level we were created on, it's updated
   335   // if we detect the appshell is on a lower level as long as we're not stopped.
   336   // We delay DoStopPlugin() until the appshell reaches this level or lower.
   337   uint32_t                    mLastEventloopNestingLevel;
   338   bool                        mContentFocused;
   339   bool                        mWidgetVisible;    // used on Mac to store our widget's visible state
   340 #ifdef XP_MACOSX
   341   bool                        mPluginPortChanged;
   342 #endif
   343 #ifdef MOZ_X11
   344   // Used with windowless plugins only, initialized in CreateWidget().
   345   bool                        mFlash10Quirks;
   346 #endif
   347   bool                        mPluginWindowVisible;
   348   bool                        mPluginDocumentActiveState;
   350   uint16_t          mNumCachedAttrs;
   351   uint16_t          mNumCachedParams;
   352   char              **mCachedAttrParamNames;
   353   char              **mCachedAttrParamValues;
   355 #ifdef XP_MACOSX
   356   NPEventModel mEventModel;
   357   // This is a hack! UseAsyncRendering() can incorrectly return false
   358   // when we don't have an object frame (possible as of bug 90268).
   359   // We hack around this by always returning true if we've ever
   360   // returned true.
   361   bool mUseAsyncRendering;
   362 #endif
   364   // pointer to wrapper for nsIDOMContextMenuListener
   365   nsRefPtr<nsPluginDOMContextMenuListener> mCXMenuListener;
   367   nsresult DispatchKeyToPlugin(nsIDOMEvent* aKeyEvent);
   368   nsresult DispatchMouseToPlugin(nsIDOMEvent* aMouseEvent,
   369                                  bool aAllowPropagate = false);
   370   nsresult DispatchFocusToPlugin(nsIDOMEvent* aFocusEvent);
   372   int mLastMouseDownButtonType;
   374   nsresult EnsureCachedAttrParamArrays();
   376 #ifdef MOZ_X11
   377   class Renderer
   378 #if defined(MOZ_WIDGET_QT)
   379   : public gfxQtNativeRenderer
   380 #else
   381   : public gfxXlibNativeRenderer
   382 #endif
   383   {
   384   public:
   385     Renderer(NPWindow* aWindow, nsPluginInstanceOwner* aInstanceOwner,
   386              const nsIntSize& aPluginSize, const nsIntRect& aDirtyRect)
   387     : mWindow(aWindow), mInstanceOwner(aInstanceOwner),
   388     mPluginSize(aPluginSize), mDirtyRect(aDirtyRect)
   389     {}
   390     virtual nsresult DrawWithXlib(cairo_surface_t* surface,
   391                                   nsIntPoint offset,
   392                                   nsIntRect* clipRects, uint32_t numClipRects) MOZ_OVERRIDE;
   393   private:
   394     NPWindow* mWindow;
   395     nsPluginInstanceOwner* mInstanceOwner;
   396     const nsIntSize& mPluginSize;
   397     const nsIntRect& mDirtyRect;
   398   };
   399 #endif
   401   bool mWaitingForPaint;
   402 };
   404 #endif // nsPluginInstanceOwner_h_

mercurial