Bug 1148978 - Remove plugin window update composition deferment. r=mattwoodrow
MozReview-Commit-ID: AaRSO8RgY81
--- a/gfx/layers/ipc/CompositorBridgeParent.cpp
+++ b/gfx/layers/ipc/CompositorBridgeParent.cpp
@@ -688,17 +688,16 @@ CompositorBridgeParent::CompositorBridge
, mResetCompositorMonitor("ResetCompositorMonitor")
, mRootLayerTreeID(AllocateLayerTreeId())
, mOverrideComposeReadiness(false)
, mForceCompositionTask(nullptr)
, mCompositorThreadHolder(sCompositorThreadHolder)
, mCompositorScheduler(nullptr)
#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
, mLastPluginUpdateLayerTreeId(0)
- , mPluginUpdateResponsePending(false)
, mDeferPluginWindows(false)
, mPluginWindowsHidden(false)
#endif
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(CompositorThread(),
"The compositor thread must be Initialized before instanciating a CompositorBridgeParent.");
MOZ_COUNT_CTOR(CompositorBridgeParent);
@@ -1229,63 +1228,42 @@ CompositorBridgeParent::CompositeToTarge
#endif
if (!CanComposite()) {
TimeStamp end = TimeStamp::Now();
DidComposite(start, end);
return;
}
-#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
- // Still waiting on plugin update confirmation
- if (mPluginUpdateResponsePending) {
- return;
- }
-#endif
-
- bool hasRemoteContent = false;
- bool pluginsUpdatedFlag = true;
- AutoResolveRefLayers resolve(mCompositionManager, this,
- &hasRemoteContent,
- &pluginsUpdatedFlag);
-
-#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
/*
* AutoResolveRefLayers handles two tasks related to Windows and Linux
* plugin window management:
* 1) calculating if we have remote content in the view. If we do not have
* remote content, all plugin windows for this CompositorBridgeParent (window)
* can be hidden since we do not support plugins in chrome when running
* under e10s.
* 2) Updating plugin position, size, and clip. We do this here while the
* remote layer tree is hooked up to to chrome layer tree. This is needed
* since plugin clipping can depend on chrome (for example, due to tab modal
* prompts). Updates in step 2 are applied via an async ipc message sent
* to the main thread.
- * Windows specific: The compositor will wait for confirmation that plugin
- * updates have been applied before painting. Deferment of painting is
- * indicated by the mPluginUpdateResponsePending flag. The main thread
- * messages back using the RemotePluginsReady async ipc message.
- * This is neccessary since plugin windows can leave remnants of window
- * content if moved after the underlying window paints.
*/
- if (pluginsUpdatedFlag) {
- mPluginUpdateResponsePending = true;
- return;
- }
+ bool hasRemoteContent = false;
+ bool updatePluginsFlag = true;
+ AutoResolveRefLayers resolve(mCompositionManager, this,
+ &hasRemoteContent,
+ &updatePluginsFlag);
+#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
// We do not support plugins in local content. When switching tabs
// to local pages, hide every plugin associated with the window.
if (!hasRemoteContent && BrowserTabsRemoteAutostart() &&
mCachedPluginData.Length()) {
Unused << SendHideAllPlugins((uintptr_t)GetWidget());
mCachedPluginData.Clear();
- // Wait for confirmation the hide operation is complete.
- mPluginUpdateResponsePending = true;
- return;
}
#endif
if (aTarget) {
mLayerManager->BeginTransactionWithDrawTarget(aTarget, *aRect);
} else {
mLayerManager->BeginTransaction();
}
@@ -1359,17 +1337,16 @@ CompositorBridgeParent::CompositeToTarge
mozilla::Telemetry::AccumulateTimeDelta(mozilla::Telemetry::COMPOSITE_TIME, start);
profiler_tracing("Paint", "Composite", TRACING_INTERVAL_END);
}
bool
CompositorBridgeParent::RecvRemotePluginsReady()
{
#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
- mPluginUpdateResponsePending = false;
ScheduleComposition();
return true;
#else
NS_NOTREACHED("CompositorBridgeParent::RecvRemotePluginsReady calls "
"unexpected on this platform.");
return false;
#endif
}
@@ -2571,17 +2548,16 @@ CompositorBridgeParent::HideAllPluginWin
{
MOZ_ASSERT(!NS_IsMainThread());
// No plugins in the cache implies no plugins to manage
// in this content.
if (!mCachedPluginData.Length() || mDeferPluginWindows) {
return;
}
mDeferPluginWindows = true;
- mPluginUpdateResponsePending = true;
mPluginWindowsHidden = true;
Unused << SendHideAllPlugins((uintptr_t)GetWidget());
ScheduleComposition();
}
#endif // #if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
void
CrossProcessCompositorBridgeParent::DidComposite(
--- a/gfx/layers/ipc/CompositorBridgeParent.h
+++ b/gfx/layers/ipc/CompositorBridgeParent.h
@@ -589,19 +589,16 @@ protected:
RefPtr<CompositorVsyncScheduler> mCompositorScheduler;
#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
// cached plugin data used to reduce the number of updates we request.
uint64_t mLastPluginUpdateLayerTreeId;
nsIntPoint mPluginsLayerOffset;
nsIntRegion mPluginsLayerVisibleRegion;
nsTArray<PluginWindowData> mCachedPluginData;
- // indicates if we are currently waiting on a plugin update confirmation.
- // When this is true, composition is currently on hold.
- bool mPluginUpdateResponsePending;
// indicates if plugin window visibility and metric updates are currently
// being defered due to a scroll operation.
bool mDeferPluginWindows;
// indicates if the plugin windows were hidden, and need to be made
// visible again even if their geometry has not changed.
bool mPluginWindowsHidden;
#endif