From cc0f0fc4ffe68ff3890b75fa65aae3931ef90796 Mon Sep 17 00:00:00 2001 From: Oleg Romashin Date: Sat, 2 Oct 2010 09:00:45 -0700 Subject: [PATCH] Bug 599476 - windowless plugins in object elements with data (e.g. certain Flash pages) are not painted. r=karlt a=beta7 --- layout/generic/nsObjectFrame.cpp | 19 ++++-------------- layout/reftests/bugs/599476-ref.html | 7 +++++++ layout/reftests/bugs/599476.html | 7 +++++++ layout/reftests/bugs/reftest.list | 1 + .../plugin/base/src/nsNPAPIPluginInstance.cpp | 20 ++++++++++++++++++- .../plugin/base/src/nsNPAPIPluginInstance.h | 2 ++ .../base/src/nsPluginStreamListenerPeer.cpp | 6 ++++++ 7 files changed, 46 insertions(+), 16 deletions(-) create mode 100644 layout/reftests/bugs/599476-ref.html create mode 100644 layout/reftests/bugs/599476.html diff --git a/layout/generic/nsObjectFrame.cpp b/layout/generic/nsObjectFrame.cpp index 1d419e7c21d9..9a3d0cd66c17 100644 --- a/layout/generic/nsObjectFrame.cpp +++ b/layout/generic/nsObjectFrame.cpp @@ -459,7 +459,10 @@ public: PRBool UseLayers() { - return (mUsePluginLayers && + PRBool useAsyncRendering; + return (mInstance && + NS_SUCCEEDED(mInstance->UseAsyncPainting(&useAsyncRendering)) && + useAsyncRendering && (!mPluginWindow || mPluginWindow->type == NPWindowTypeDrawable)); } @@ -593,7 +596,6 @@ private: nsRefPtr mLayerSurface; PRPackedBool mWaitingForPaint; - PRPackedBool mUsePluginLayers; }; // Mac specific code to fix up port position and clip @@ -2787,13 +2789,6 @@ nsPluginInstanceOwner::nsPluginInstanceOwner() #endif mWaitingForPaint = PR_FALSE; - mUsePluginLayers = - nsContentUtils::GetBoolPref("mozilla.plugins.use_layers", -#ifdef MOZ_X11 - PR_TRUE); // Lets test plugin layers on X11 first -#else - PR_FALSE); // Lets test plugin layers on X11 first -#endif PR_LOG(nsObjectFrameLM, PR_LOG_DEBUG, ("nsPluginInstanceOwner %p created\n", this)); @@ -2879,12 +2874,6 @@ nsPluginInstanceOwner::SetInstance(nsIPluginInstance *aInstance) NS_ASSERTION(!mInstance || !aInstance, "mInstance should only be set once!"); mInstance = aInstance; - PRBool useAsyncPainting = PR_FALSE; - if (mInstance && - mUsePluginLayers && - NS_SUCCEEDED(mInstance->UseAsyncPainting(&useAsyncPainting)) && - !useAsyncPainting) - mUsePluginLayers = PR_FALSE; return NS_OK; } diff --git a/layout/reftests/bugs/599476-ref.html b/layout/reftests/bugs/599476-ref.html new file mode 100644 index 000000000000..6734f384e39b --- /dev/null +++ b/layout/reftests/bugs/599476-ref.html @@ -0,0 +1,7 @@ + + + + +
+ + diff --git a/layout/reftests/bugs/599476.html b/layout/reftests/bugs/599476.html new file mode 100644 index 000000000000..69aa8a52b390 --- /dev/null +++ b/layout/reftests/bugs/599476.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list index bdfbc80e1a8c..f0a39d8f5a28 100644 --- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -1506,3 +1506,4 @@ random-if(layersGPUAccelerated) == 581317-1.html 581317-1-ref.html == 593544-1.html 593544-1-ref.html == 594737-1.html 594737-1-ref.html == 594624-1.html 594624-1-ref.html +fails-if(!haveTestPlugin) == 599476.html 599476-ref.html diff --git a/modules/plugin/base/src/nsNPAPIPluginInstance.cpp b/modules/plugin/base/src/nsNPAPIPluginInstance.cpp index c69153713f87..11b73ee72916 100644 --- a/modules/plugin/base/src/nsNPAPIPluginInstance.cpp +++ b/modules/plugin/base/src/nsNPAPIPluginInstance.cpp @@ -84,7 +84,12 @@ nsNPAPIPluginInstance::nsNPAPIPluginInstance(nsNPAPIPlugin* plugin) mPlugin(plugin), mMIMEType(nsnull), mOwner(nsnull), - mCurrentPluginEvent(nsnull) + mCurrentPluginEvent(nsnull), +#ifdef MOZ_X11 + mUsePluginLayersPref(PR_TRUE) +#else + mUsePluginLayersPref(PR_FALSE) +#endif { NS_ASSERTION(mPlugin != NULL, "Plugin is required when creating an instance."); @@ -93,6 +98,14 @@ nsNPAPIPluginInstance::nsNPAPIPluginInstance(nsNPAPIPlugin* plugin) mNPP.pdata = NULL; mNPP.ndata = this; + nsCOMPtr prefs(do_GetService(NS_PREFSERVICE_CONTRACTID)); + if (prefs) { + PRBool useLayersPref; + nsresult rv = prefs->GetBoolPref("mozilla.plugins.use_layers", &useLayersPref); + if (NS_SUCCEEDED(rv)) + mUsePluginLayersPref = useLayersPref; + } + PLUGIN_LOG(PLUGIN_LOG_BASIC, ("nsNPAPIPluginInstance ctor: this=%p\n",this)); } @@ -878,6 +891,11 @@ nsNPAPIPluginInstance::NotifyPainted(void) NS_IMETHODIMP nsNPAPIPluginInstance::UseAsyncPainting(PRBool* aIsAsync) { + if (!mUsePluginLayersPref) { + *aIsAsync = mUsePluginLayersPref; + return NS_OK; + } + PluginDestructionGuard guard(this); if (!mPlugin) diff --git a/modules/plugin/base/src/nsNPAPIPluginInstance.h b/modules/plugin/base/src/nsNPAPIPluginInstance.h index 0fd2a6803f17..c00af5f7a53f 100644 --- a/modules/plugin/base/src/nsNPAPIPluginInstance.h +++ b/modules/plugin/base/src/nsNPAPIPluginInstance.h @@ -204,6 +204,8 @@ private: mozilla::TimeStamp mStopTime; nsCOMPtr mURI; + + PRPackedBool mUsePluginLayersPref; }; #endif // nsNPAPIPluginInstance_h_ diff --git a/modules/plugin/base/src/nsPluginStreamListenerPeer.cpp b/modules/plugin/base/src/nsPluginStreamListenerPeer.cpp index 3e9c8a1bd66a..6ae191f9ef52 100644 --- a/modules/plugin/base/src/nsPluginStreamListenerPeer.cpp +++ b/modules/plugin/base/src/nsPluginStreamListenerPeer.cpp @@ -598,6 +598,12 @@ nsPluginStreamListenerPeer::OnStartRequest(nsIRequest *request, // If we've got a native window, the let the plugin know about it. if (window->window) { ((nsPluginNativeWindow*)window)->CallSetWindow(pluginInstCOMPtr); + } else { + PRBool useAsyncPainting = PR_FALSE; + mPluginInstance->UseAsyncPainting(&useAsyncPainting); + if (useAsyncPainting) { + mPluginInstance->AsyncSetWindow(window); + } } } }