Changeset 197064 in webkit
- Timestamp:
- Feb 24, 2016, 11:45:13 PM (11 years ago)
- Location:
- releases/WebKitGTK/webkit-2.10/Source
- Files:
-
- 5 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/platform/gtk/GtkUtilities.cpp (modified) (1 diff)
-
WebKit2/ChangeLog (modified) (1 diff)
-
WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp (modified) (7 diffs)
-
WebKit2/UIProcess/cairo/BackingStoreCairo.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog
r196933 r197064 1 2016-02-24 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK] Tearing when entering AC mode 4 https://bugs.webkit.org/show_bug.cgi?id=150955 5 6 Reviewed by Michael Catanzaro. 7 8 * platform/gtk/GtkUtilities.cpp: 9 (WebCore::widgetIsOnscreenToplevelWindow): Allow passing nullptr. 10 1 11 2016-02-19 Philippe Normand <pnormand@igalia.com> 2 12 -
releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/gtk/GtkUtilities.cpp
r185502 r197064 52 52 bool widgetIsOnscreenToplevelWindow(GtkWidget* widget) 53 53 { 54 return gtk_widget_is_toplevel(widget) && GTK_IS_WINDOW(widget) && !GTK_IS_OFFSCREEN_WINDOW(widget);54 return widget && gtk_widget_is_toplevel(widget) && GTK_IS_WINDOW(widget) && !GTK_IS_OFFSCREEN_WINDOW(widget); 55 55 } 56 56 -
releases/WebKitGTK/webkit-2.10/Source/WebKit2/ChangeLog
r197063 r197064 1 2016-02-24 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK] Tearing when entering AC mode 4 https://bugs.webkit.org/show_bug.cgi?id=150955 5 6 Reviewed by Michael Catanzaro. 7 8 When entering accelerated compositing mode, we keep rendering the 9 non accelerated contents until we have the first frame of 10 accelerated compositing contents. When the view is created hidden, 11 for example when the browser opens a link in a new tab, the view 12 is not realized until it is mapped. The native surface handle for 13 compositing, needed by the web process to render accelerated 14 compositing contents, is not available until the view is realized, 15 because it depends on the properties of the parent. When a web 16 view is mapped for the first time, and then realized, we send the 17 native surface handle for compositing to the web process, and keep 18 rendering the non composited contents until we get the first 19 frame, but in this case we never had non composited contents and 20 we end up rendering an untinitalized surface. This sometimes just 21 produces flickering and sometimes rendering artifacts. 22 We can prevent this from happening by realizing the web view as 23 soon as possible. A GtkWidget can't be realized until it has been 24 added to a toplevel, so we can realize our view right after it is 25 added to a toplevel window, and wait until the view is actually 26 mapped to notify the web process that it has been added to a 27 window. This way can we enter accelerated compositing mode before 28 the web view is mapped, so that when mapped we don't try to paint 29 the previous contents and don't need to wait for the first frame. 30 31 * UIProcess/API/gtk/WebKitWebViewBase.cpp: 32 (toplevelWindowFocusInEvent): Handle the case of the window being 33 hidden when receiving focus in. According to 34 gtk_window_focus_in_event, this can happen. 35 (webkitWebViewBaseSetToplevelOnScreenWindow): When the web view is 36 removed from its toplevel parent, update the IsInWindow and 37 WindowIsActive flags accordingly. When the view is added to a 38 toplevel, realize it and don't update the window flags, they will be 39 updated when the view is mapped the first time. 40 (webkitWebViewBaseMap): Also update IsInWindow and WindowIsActive 41 flags if needed. This way, if for example you open a youtube video 42 in a new tab, the video won't start playing until you visit the 43 tab, like we did when the view was realized on map. 44 (webkitWebViewBaseHierarchyChanged): Use hierarchy-changed signal 45 instead of parent-set to be notified when the view is added to or 46 removed from a toplevel. 47 (webkit_web_view_base_class_init): Implement hierarchy-changed 48 instead of parent-set. 49 (webkitWebViewBaseRealize): Do not call 50 webkitWebViewBaseSetToplevelOnScreenWindow on realize, it's now 51 webkitWebViewBaseSetToplevelOnScreenWindow the one realizing the view. 52 * UIProcess/cairo/BackingStoreCairo.cpp: 53 (WebKit::BackingStore::createBackend): Do not realize the view 54 here, it should be realized already at this point. If it's not 55 realized at this point is because it hasn't been added to a 56 toplevel and gtk_widget_realize will not work anyway. 57 (WebKit::BackingStore::paint): This is changing the cairo source 58 operator, so save/restore the cairo context to ensure it doesn't 59 affect other drawing done after this. 60 1 61 2016-02-03 Carlos Garcia Campos <cgarcia@igalia.com> 2 62 -
releases/WebKitGTK/webkit-2.10/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
r197063 r197064 227 227 } 228 228 229 static gboolean toplevelWindowFocusInEvent(GtkWidget*, GdkEventFocus*, WebKitWebViewBase* webViewBase) 230 { 229 static gboolean toplevelWindowFocusInEvent(GtkWidget* widget, GdkEventFocus*, WebKitWebViewBase* webViewBase) 230 { 231 // Spurious focus in events can occur when the window is hidden. 232 if (!gtk_widget_get_visible(widget)) 233 return FALSE; 234 231 235 WebKitWebViewBasePrivate* priv = webViewBase->priv; 232 236 if (priv->viewState & ViewState::WindowIsActive) … … 290 294 291 295 priv->toplevelOnScreenWindow = window; 292 if (!(priv->viewState & ViewState::IsInWindow)) { 293 priv->viewState |= ViewState::IsInWindow; 294 webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsInWindow); 295 } 296 if (!priv->toplevelOnScreenWindow) 297 return; 296 297 if (!priv->toplevelOnScreenWindow) { 298 ViewState::Flags flagsToUpdate = 0; 299 if (priv->viewState & ViewState::IsInWindow) { 300 priv->viewState &= ~ViewState::IsInWindow; 301 flagsToUpdate |= ViewState::IsInWindow; 302 } 303 if (priv->viewState & ViewState::WindowIsActive) { 304 priv->viewState &= ~ViewState::WindowIsActive; 305 flagsToUpdate |= ViewState::IsInWindow; 306 } 307 if (flagsToUpdate) 308 webkitWebViewBaseScheduleUpdateViewState(webViewBase, flagsToUpdate); 309 310 return; 311 } 298 312 299 313 priv->toplevelFocusInEventID = … … 305 319 priv->toplevelWindowStateEventID = 306 320 g_signal_connect(priv->toplevelOnScreenWindow, "window-state-event", G_CALLBACK(toplevelWindowStateEvent), webViewBase); 321 gtk_widget_realize(GTK_WIDGET(webViewBase)); 307 322 } 308 323 … … 373 388 374 389 gtk_im_context_set_client_window(priv->inputMethodFilter.context(), window); 375 376 GtkWidget* toplevel = gtk_widget_get_toplevel(widget);377 if (widgetIsOnscreenToplevelWindow(toplevel))378 webkitWebViewBaseSetToplevelOnScreenWindow(webView, GTK_WINDOW(toplevel));379 390 } 380 391 … … 660 671 WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget); 661 672 WebKitWebViewBasePrivate* priv = webViewBase->priv; 662 if (priv->viewState & ViewState::IsVisible) 663 return; 664 665 priv->viewState |= ViewState::IsVisible; 666 webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsVisible); 673 ViewState::Flags flagsToUpdate = 0; 674 if (!(priv->viewState & ViewState::IsVisible)) 675 flagsToUpdate |= ViewState::IsVisible; 676 if (priv->toplevelOnScreenWindow) { 677 if (!(priv->viewState & ViewState::IsInWindow)) 678 flagsToUpdate |= ViewState::IsInWindow; 679 if (gtk_window_is_active(GTK_WINDOW(priv->toplevelOnScreenWindow)) && !(priv->viewState & ViewState::WindowIsActive)) 680 flagsToUpdate |= ViewState::WindowIsActive; 681 } 682 if (!flagsToUpdate) 683 return; 684 685 priv->viewState |= flagsToUpdate; 686 webkitWebViewBaseScheduleUpdateViewState(webViewBase, flagsToUpdate); 667 687 } 668 688 … … 1062 1082 #endif // ENABLE(DRAG_SUPPORT) 1063 1083 1064 static void webkitWebViewBaseParentSet(GtkWidget* widget, GtkWidget* /* oldParent */) 1065 { 1066 if (!gtk_widget_get_parent(widget)) 1067 webkitWebViewBaseSetToplevelOnScreenWindow(WEBKIT_WEB_VIEW_BASE(widget), 0); 1084 static void webkitWebViewBaseHierarchyChanged(GtkWidget* widget, GtkWidget* oldToplevel) 1085 { 1086 WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(widget)->priv; 1087 if (widgetIsOnscreenToplevelWindow(oldToplevel) && GTK_WINDOW(oldToplevel) == priv->toplevelOnScreenWindow) { 1088 webkitWebViewBaseSetToplevelOnScreenWindow(WEBKIT_WEB_VIEW_BASE(widget), nullptr); 1089 return; 1090 } 1091 1092 if (!oldToplevel) { 1093 GtkWidget* toplevel = gtk_widget_get_toplevel(widget); 1094 if (widgetIsOnscreenToplevelWindow(toplevel)) 1095 webkitWebViewBaseSetToplevelOnScreenWindow(WEBKIT_WEB_VIEW_BASE(widget), GTK_WINDOW(toplevel)); 1096 } 1068 1097 } 1069 1098 … … 1124 1153 #endif // ENABLE(DRAG_SUPPORT) 1125 1154 widgetClass->get_accessible = webkitWebViewBaseGetAccessible; 1126 widgetClass-> parent_set = webkitWebViewBaseParentSet;1155 widgetClass->hierarchy_changed = webkitWebViewBaseHierarchyChanged; 1127 1156 widgetClass->destroy = webkitWebViewBaseDestroy; 1128 1157 -
releases/WebKitGTK/webkit-2.10/Source/WebKit2/UIProcess/cairo/BackingStoreCairo.cpp
r191563 r197064 68 68 69 69 #if PLATFORM(GTK) 70 GtkWidget* viewWidget = m_webPageProxy.viewWidget(); 71 gtk_widget_realize(viewWidget); 72 RefPtr<cairo_surface_t> surface = adoptRef(gdk_window_create_similar_surface(gtk_widget_get_window(viewWidget), 70 RefPtr<cairo_surface_t> surface = adoptRef(gdk_window_create_similar_surface(gtk_widget_get_window(m_webPageProxy.viewWidget()), 73 71 CAIRO_CONTENT_COLOR_ALPHA, scaledSize.width(), scaledSize.height())); 74 72 #else … … 84 82 ASSERT(m_backend); 85 83 84 cairo_save(context); 86 85 cairo_set_operator(context, CAIRO_OPERATOR_SOURCE); 87 86 cairo_set_source_surface(context, m_backend->surface(), 0, 0); 88 87 cairo_rectangle(context, rect.x(), rect.y(), rect.width(), rect.height()); 89 88 cairo_fill(context); 89 cairo_restore(context); 90 90 } 91 91
Note:
See TracChangeset
for help on using the changeset viewer.