1 changeset: 312069:3c2bd9158ad3
2 user: Timothy Nikkel <tnikkel@gmail.com>
3 Date: Tue May 10 22:58:47 2016 -0500
4 summary: Bug 1261752. Part 3. r=mats a=ritu
6 diff -r 73cc9a2d8fc1 -r 3c2bd9158ad3 layout/forms/nsComboboxControlFrame.cpp
7 --- a/layout/forms/nsComboboxControlFrame.cpp Tue May 10 22:58:47 2016 -0500
8 +++ b/layout/forms/nsComboboxControlFrame.cpp Tue May 10 22:58:47 2016 -0500
10 // The popup's visibility doesn't update until the minimize animation has
11 // finished, so call UpdateWidgetGeometry to update it right away.
12 nsViewManager* viewManager = mDropdownFrame->GetView()->GetViewManager();
13 - viewManager->UpdateWidgetGeometry();
14 + viewManager->UpdateWidgetGeometry(); // might destroy us
17 + if (!weakFrame.IsAlive()) {
22 diff -r 73cc9a2d8fc1 -r 3c2bd9158ad3 view/nsViewManager.cpp
23 --- a/view/nsViewManager.cpp Tue May 10 22:58:47 2016 -0500
24 +++ b/view/nsViewManager.cpp Tue May 10 22:58:47 2016 -0500
27 void nsViewManager::WillPaintWindow(nsIWidget* aWidget)
30 - nsView* view = nsView::GetViewFor(aWidget);
31 - LayerManager *manager = aWidget->GetLayerManager();
32 + RefPtr<nsIWidget> widget(aWidget);
34 + nsView* view = nsView::GetViewFor(widget);
35 + LayerManager* manager = widget->GetLayerManager();
37 (view->ForcedRepaint() || !manager->NeedsWidgetInvalidation())) {
38 ProcessPendingUpdates();
39 // Re-get the view pointer here since the ProcessPendingUpdates might have
40 // destroyed it during CallWillPaintOnObservers.
41 - view = nsView::GetViewFor(aWidget);
42 + view = nsView::GetViewFor(widget);
44 view->SetForcedRepaint(false);
46 diff -r 73cc9a2d8fc1 -r 3c2bd9158ad3 widget/PuppetWidget.cpp
47 --- a/widget/PuppetWidget.cpp Tue May 10 22:58:47 2016 -0500
48 +++ b/widget/PuppetWidget.cpp Tue May 10 22:58:47 2016 -0500
50 mDirtyRegion.SetEmpty();
53 + RefPtr<PuppetWidget> strongThis(this);
55 mAttachedWidgetListener->WillPaintWindow(this);
57 if (mAttachedWidgetListener) {
58 diff -r 73cc9a2d8fc1 -r 3c2bd9158ad3 widget/cocoa/nsChildView.mm
59 --- a/widget/cocoa/nsChildView.mm Tue May 10 22:58:47 2016 -0500
60 +++ b/widget/cocoa/nsChildView.mm Tue May 10 22:58:47 2016 -0500
65 + nsAutoRetainCocoaObject kungFuDeathGrip(self);
68 // The OS normally *will* draw our NSWindow, no matter what we do here.
69 // But Gecko can delete our parent widget(s) (along with mGeckoChild)
70 diff -r 73cc9a2d8fc1 -r 3c2bd9158ad3 widget/gonk/nsWindow.cpp
71 --- a/widget/gonk/nsWindow.cpp Tue May 10 22:58:47 2016 -0500
72 +++ b/widget/gonk/nsWindow.cpp Tue May 10 22:58:47 2016 -0500
77 - nsWindow *targetWindow = (nsWindow *)sTopWindows[0];
78 + RefPtr<nsWindow> targetWindow = (nsWindow *)sTopWindows[0];
79 while (targetWindow->GetLastChild())
80 targetWindow = (nsWindow *)targetWindow->GetLastChild();
83 listener->WillPaintWindow(targetWindow);
86 - LayerManager* lm = targetWindow->GetLayerManager();
87 - if (mozilla::layers::LayersBackend::LAYERS_CLIENT == lm->GetBackendType()) {
88 - // No need to do anything, the compositor will handle drawing
90 - NS_RUNTIMEABORT("Unexpected layer manager type");
93 listener = targetWindow->GetWidgetListener();
95 + LayerManager* lm = targetWindow->GetLayerManager();
96 + if (mozilla::layers::LayersBackend::LAYERS_CLIENT == lm->GetBackendType()) {
97 + // No need to do anything, the compositor will handle drawing
99 + NS_RUNTIMEABORT("Unexpected layer manager type");
102 listener->DidPaintWindow();
105 diff -r 73cc9a2d8fc1 -r 3c2bd9158ad3 widget/gtk/nsWindow.cpp
106 --- a/widget/gtk/nsWindow.cpp Tue May 10 22:58:47 2016 -0500
107 +++ b/widget/gtk/nsWindow.cpp Tue May 10 22:58:47 2016 -0500
113 +nsWindow::GetListener()
115 + return mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
119 nsWindow::DispatchEvent(WidgetGUIEvent* aEvent, nsEventStatus& aStatus)
122 aEvent->refPoint.y = GdkCoordToDevicePixels(aEvent->refPoint.y);
124 aStatus = nsEventStatus_eIgnore;
125 - nsIWidgetListener* listener =
126 - mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
127 + nsIWidgetListener* listener = GetListener();
129 aStatus = listener->HandleEvent(aEvent, mUseAttachedEvents);
131 @@ -2119,8 +2124,7 @@
132 if (!mGdkWindow || mIsFullyObscured || !mHasMappedToplevel)
135 - nsIWidgetListener *listener =
136 - mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
137 + nsIWidgetListener *listener = GetListener();
141 @@ -2149,6 +2153,8 @@
142 clientLayers->SendInvalidRegion(region);
145 + RefPtr<nsWindow> strongThis(this);
147 // Dispatch WillPaintWindow notification to allow scripts etc. to run
150 @@ -2161,8 +2167,7 @@
152 // Re-get the listener since the will paint notification might have
155 - mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
156 + listener = GetListener();
160 @@ -2223,6 +2228,13 @@
161 // If this widget uses OMTC...
162 if (GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT) {
163 listener->PaintWindow(this, region);
165 + // Re-get the listener since the will paint notification might have
167 + listener = GetListener();
171 listener->DidPaintWindow();
174 @@ -2307,6 +2319,13 @@
175 if (GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_BASIC) {
176 AutoLayerManagerSetup setupLayerManager(this, ctx, layerBuffering);
177 painted = listener->PaintWindow(this, region);
179 + // Re-get the listener since the will paint notification might have
181 + listener = GetListener();
188 diff -r 73cc9a2d8fc1 -r 3c2bd9158ad3 widget/gtk/nsWindow.h
189 --- a/widget/gtk/nsWindow.h Tue May 10 22:58:47 2016 -0500
190 +++ b/widget/gtk/nsWindow.h Tue May 10 22:58:47 2016 -0500
192 GdkWindow** aWindow, gint* aButton,
193 gint* aRootX, gint* aRootY);
194 void ClearCachedResources();
195 + nsIWidgetListener* GetListener();
198 MozContainer *mContainer;
199 diff -r 73cc9a2d8fc1 -r 3c2bd9158ad3 widget/qt/nsWindow.cpp
200 --- a/widget/qt/nsWindow.cpp Tue May 10 22:58:47 2016 -0500
201 +++ b/widget/qt/nsWindow.cpp Tue May 10 22:58:47 2016 -0500
202 @@ -857,18 +857,28 @@
207 +nsWindow::GetPaintListener()
209 + return mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
215 LOGDRAW(("nsWindow::%s [%p]\n", __FUNCTION__, (void *)this));
216 - nsIWidgetListener* listener =
217 - mAttachedWidgetListener ? mAttachedWidgetListener : mWidgetListener;
218 + nsIWidgetListener* listener = GetPaintListener();
223 listener->WillPaintWindow(this);
225 + nsIWidgetListener* listener = GetPaintListener();
230 switch (GetLayerManager()->GetBackendType()) {
231 case mozilla::layers::LayersBackend::LAYERS_CLIENT: {
232 nsIntRegion region(nsIntRect(0, 0, mWidget->width(), mWidget->height()));
234 NS_ERROR("Invalid layer manager");
237 + nsIWidgetListener* listener = GetPaintListener();
242 listener->DidPaintWindow();
245 diff -r 73cc9a2d8fc1 -r 3c2bd9158ad3 widget/qt/nsWindow.h
246 --- a/widget/qt/nsWindow.h Tue May 10 22:58:47 2016 -0500
247 +++ b/widget/qt/nsWindow.h Tue May 10 22:58:47 2016 -0500
250 } MozCachedMoveEvent;
252 + nsIWidgetListener* GetPaintListener();
253 bool CheckForRollup(double aMouseX, double aMouseY, bool aIsWheel);
254 void* SetupPluginPort(void);
255 nsresult SetWindowIconList(const nsTArray<nsCString> &aIconList);
256 diff -r 73cc9a2d8fc1 -r 3c2bd9158ad3 widget/windows/nsWindowGfx.cpp
257 --- a/widget/windows/nsWindowGfx.cpp Tue May 10 22:58:47 2016 -0500
258 +++ b/widget/windows/nsWindowGfx.cpp Tue May 10 22:58:47 2016 -0500
260 clientLayerManager->SendInvalidRegion(region);
263 + RefPtr<nsWindow> strongThis(this);
265 nsIWidgetListener* listener = GetPaintListener();
267 listener->WillPaintWindow(this);