Bug 1261752. Part 3. r=mats a=ritu

This commit is contained in:
Timothy Nikkel 2016-05-10 22:58:47 -05:00
parent 9d6c5fedee
commit 0dbe2411a9
10 changed files with 68 additions and 21 deletions

View File

@ -1473,7 +1473,11 @@ nsComboboxControlFrame::Rollup(uint32_t aCount, bool aFlush,
// The popup's visibility doesn't update until the minimize animation has
// finished, so call UpdateWidgetGeometry to update it right away.
nsViewManager* viewManager = mDropdownFrame->GetView()->GetViewManager();
viewManager->UpdateWidgetGeometry();
viewManager->UpdateWidgetGeometry(); // might destroy us
}
if (!weakFrame.IsAlive()) {
return consume;
}
if (aLastRolledUp) {

View File

@ -693,15 +693,16 @@ void nsViewManager::InvalidateViews(nsView *aView)
void nsViewManager::WillPaintWindow(nsIWidget* aWidget)
{
if (aWidget) {
nsView* view = nsView::GetViewFor(aWidget);
LayerManager *manager = aWidget->GetLayerManager();
RefPtr<nsIWidget> widget(aWidget);
if (widget) {
nsView* view = nsView::GetViewFor(widget);
LayerManager* manager = widget->GetLayerManager();
if (view &&
(view->ForcedRepaint() || !manager->NeedsWidgetInvalidation())) {
ProcessPendingUpdates();
// Re-get the view pointer here since the ProcessPendingUpdates might have
// destroyed it during CallWillPaintOnObservers.
view = nsView::GetViewFor(aWidget);
view = nsView::GetViewFor(widget);
if (view) {
view->SetForcedRepaint(false);
}

View File

@ -1048,6 +1048,8 @@ PuppetWidget::Paint()
mDirtyRegion.SetEmpty();
mPaintTask.Revoke();
RefPtr<PuppetWidget> strongThis(this);
GetCurrentWidgetListener()->WillPaintWindow(this);
if (GetCurrentWidgetListener()) {

View File

@ -4001,6 +4001,8 @@ NSEvent* gLastDragMouseDownEvent = nil;
- (void)viewWillDraw
{
nsAutoRetainCocoaObject kungFuDeathGrip(self);
if (mGeckoChild) {
// The OS normally *will* draw our NSWindow, no matter what we do here.
// But Gecko can delete our parent widget(s) (along with mGeckoChild)

View File

@ -104,7 +104,7 @@ nsWindow::DoDraw(void)
return;
}
nsWindow *targetWindow = (nsWindow *)windows[0];
RefPtr<nsWindow> targetWindow = (nsWindow *)windows[0];
while (targetWindow->GetLastChild()) {
targetWindow = (nsWindow *)targetWindow->GetLastChild();
}
@ -114,15 +114,15 @@ nsWindow::DoDraw(void)
listener->WillPaintWindow(targetWindow);
}
LayerManager* lm = targetWindow->GetLayerManager();
if (mozilla::layers::LayersBackend::LAYERS_CLIENT == lm->GetBackendType()) {
// No need to do anything, the compositor will handle drawing
} else {
NS_RUNTIMEABORT("Unexpected layer manager type");
}
listener = targetWindow->GetWidgetListener();
if (listener) {
LayerManager* lm = targetWindow->GetLayerManager();
if (mozilla::layers::LayersBackend::LAYERS_CLIENT == lm->GetBackendType()) {
// No need to do anything, the compositor will handle drawing
} else {
NS_RUNTIMEABORT("Unexpected layer manager type");
}
listener->DidPaintWindow();
}
}

View File

@ -556,6 +556,12 @@ nsWindow::MaybeDispatchResized()
}
}
nsIWidgetListener*
nsWindow::GetListener()
{
return mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
}
nsresult
nsWindow::DispatchEvent(WidgetGUIEvent* aEvent, nsEventStatus& aStatus)
{
@ -564,8 +570,7 @@ nsWindow::DispatchEvent(WidgetGUIEvent* aEvent, nsEventStatus& aStatus)
nsAutoCString("something"), 0);
#endif
aStatus = nsEventStatus_eIgnore;
nsIWidgetListener* listener =
mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
nsIWidgetListener* listener = GetListener();
if (listener) {
aStatus = listener->HandleEvent(aEvent, mUseAttachedEvents);
}
@ -2122,8 +2127,7 @@ nsWindow::OnExposeEvent(cairo_t *cr)
if (!mGdkWindow || mIsFullyObscured || !mHasMappedToplevel)
return FALSE;
nsIWidgetListener *listener =
mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
nsIWidgetListener *listener = GetListener();
if (!listener)
return FALSE;
@ -2152,6 +2156,8 @@ nsWindow::OnExposeEvent(cairo_t *cr)
clientLayers->SendInvalidRegion(region.ToUnknownRegion());
}
RefPtr<nsWindow> strongThis(this);
// Dispatch WillPaintWindow notification to allow scripts etc. to run
// before we paint
{
@ -2164,8 +2170,7 @@ nsWindow::OnExposeEvent(cairo_t *cr)
// Re-get the listener since the will paint notification might have
// killed it.
listener =
mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
listener = GetListener();
if (!listener)
return FALSE;
}
@ -2226,6 +2231,13 @@ nsWindow::OnExposeEvent(cairo_t *cr)
// If this widget uses OMTC...
if (GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT) {
listener->PaintWindow(this, region);
// Re-get the listener since the will paint notification might have
// killed it.
listener = GetListener();
if (!listener)
return TRUE;
listener->DidPaintWindow();
return TRUE;
}
@ -2292,6 +2304,13 @@ nsWindow::OnExposeEvent(cairo_t *cr)
}
AutoLayerManagerSetup setupLayerManager(this, ctx, layerBuffering);
painted = listener->PaintWindow(this, region);
// Re-get the listener since the will paint notification might have
// killed it.
listener = GetListener();
if (!listener)
return TRUE;
}
}

View File

@ -424,6 +424,7 @@ private:
GdkWindow** aWindow, gint* aButton,
gint* aRootX, gint* aRootY);
void ClearCachedResources();
nsIWidgetListener* GetListener();
GtkWidget *mShell;
MozContainer *mContainer;

View File

@ -857,18 +857,28 @@ nsWindow::SetTitle(const nsAString& aTitle)
// EVENTS
nsIWidgetListener*
nsWindow::GetPaintListener()
{
return mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
}
void
nsWindow::OnPaint()
{
LOGDRAW(("nsWindow::%s [%p]\n", __FUNCTION__, (void *)this));
nsIWidgetListener* listener =
mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
nsIWidgetListener* listener = GetPaintListener();
if (!listener) {
return;
}
listener->WillPaintWindow(this);
nsIWidgetListener* listener = GetPaintListener();
if (!listener) {
return;
}
switch (GetLayerManager()->GetBackendType()) {
case mozilla::layers::LayersBackend::LAYERS_CLIENT: {
LayoutDeviceIntRegion region(
@ -880,6 +890,11 @@ nsWindow::OnPaint()
NS_ERROR("Invalid layer manager");
}
nsIWidgetListener* listener = GetPaintListener();
if (!listener) {
return;
}
listener->DidPaintWindow();
}

View File

@ -254,6 +254,7 @@ private:
bool needDispatch;
} MozCachedMoveEvent;
nsIWidgetListener* GetPaintListener();
bool CheckForRollup(double aMouseX, double aMouseY, bool aIsWheel);
void* SetupPluginPort(void);
nsresult SetWindowIconList(const nsTArray<nsCString> &aIconList);

View File

@ -290,6 +290,8 @@ bool nsWindow::OnPaint(HDC aDC, uint32_t aNestingLevel)
clientLayerManager->SendInvalidRegion(region);
}
RefPtr<nsWindow> strongThis(this);
nsIWidgetListener* listener = GetPaintListener();
if (listener) {
listener->WillPaintWindow(this);