Changeset 197117 in webkit
- Timestamp:
- Feb 25, 2016, 8:21:07 AM (11 years ago)
- Location:
- releases/WebKitGTK/webkit-2.12/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.12/Source/WebCore/ChangeLog
r197116 r197117 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-24 Brady Eidson <beidson@apple.com> 2 12 -
releases/WebKitGTK/webkit-2.12/Source/WebCore/platform/gtk/GtkUtilities.cpp
r185502 r197117 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.12/Source/WebKit2/ChangeLog
r196817 r197117 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-19 Carlos Garcia Campos <cgarcia@igalia.com> 2 62 -
releases/WebKitGTK/webkit-2.12/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp
r196475 r197117 238 238 } 239 239 240 static gboolean toplevelWindowFocusInEvent(GtkWidget*, GdkEventFocus*, WebKitWebViewBase* webViewBase) 241 { 240 static gboolean toplevelWindowFocusInEvent(GtkWidget* widget, GdkEventFocus*, WebKitWebViewBase* webViewBase) 241 { 242 // Spurious focus in events can occur when the window is hidden. 243 if (!gtk_widget_get_visible(widget)) 244 return FALSE; 245 242 246 WebKitWebViewBasePrivate* priv = webViewBase->priv; 243 247 if (priv->viewState & ViewState::WindowIsActive) … … 301 305 302 306 priv->toplevelOnScreenWindow = window; 303 if (!(priv->viewState & ViewState::IsInWindow)) { 304 priv->viewState |= ViewState::IsInWindow; 305 webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsInWindow); 306 } 307 if (!priv->toplevelOnScreenWindow) 308 return; 307 308 if (!priv->toplevelOnScreenWindow) { 309 ViewState::Flags flagsToUpdate = 0; 310 if (priv->viewState & ViewState::IsInWindow) { 311 priv->viewState &= ~ViewState::IsInWindow; 312 flagsToUpdate |= ViewState::IsInWindow; 313 } 314 if (priv->viewState & ViewState::WindowIsActive) { 315 priv->viewState &= ~ViewState::WindowIsActive; 316 flagsToUpdate |= ViewState::IsInWindow; 317 } 318 if (flagsToUpdate) 319 webkitWebViewBaseScheduleUpdateViewState(webViewBase, flagsToUpdate); 320 321 return; 322 } 309 323 310 324 priv->toplevelFocusInEventID = … … 316 330 priv->toplevelWindowStateEventID = 317 331 g_signal_connect(priv->toplevelOnScreenWindow, "window-state-event", G_CALLBACK(toplevelWindowStateEvent), webViewBase); 332 gtk_widget_realize(GTK_WIDGET(webViewBase)); 318 333 } 319 334 … … 384 399 385 400 gtk_im_context_set_client_window(priv->inputMethodFilter.context(), window); 386 387 GtkWidget* toplevel = gtk_widget_get_toplevel(widget);388 if (widgetIsOnscreenToplevelWindow(toplevel))389 webkitWebViewBaseSetToplevelOnScreenWindow(webView, GTK_WINDOW(toplevel));390 401 } 391 402 … … 671 682 WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget); 672 683 WebKitWebViewBasePrivate* priv = webViewBase->priv; 673 if (priv->viewState & ViewState::IsVisible) 674 return; 675 676 priv->viewState |= ViewState::IsVisible; 677 webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsVisible); 684 ViewState::Flags flagsToUpdate = 0; 685 if (!(priv->viewState & ViewState::IsVisible)) 686 flagsToUpdate |= ViewState::IsVisible; 687 if (priv->toplevelOnScreenWindow) { 688 if (!(priv->viewState & ViewState::IsInWindow)) 689 flagsToUpdate |= ViewState::IsInWindow; 690 if (gtk_window_is_active(GTK_WINDOW(priv->toplevelOnScreenWindow)) && !(priv->viewState & ViewState::WindowIsActive)) 691 flagsToUpdate |= ViewState::WindowIsActive; 692 } 693 if (!flagsToUpdate) 694 return; 695 696 priv->viewState |= flagsToUpdate; 697 webkitWebViewBaseScheduleUpdateViewState(webViewBase, flagsToUpdate); 678 698 } 679 699 … … 1073 1093 #endif // ENABLE(DRAG_SUPPORT) 1074 1094 1075 static void webkitWebViewBaseParentSet(GtkWidget* widget, GtkWidget* /* oldParent */) 1076 { 1077 if (!gtk_widget_get_parent(widget)) 1078 webkitWebViewBaseSetToplevelOnScreenWindow(WEBKIT_WEB_VIEW_BASE(widget), 0); 1095 static void webkitWebViewBaseHierarchyChanged(GtkWidget* widget, GtkWidget* oldToplevel) 1096 { 1097 WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(widget)->priv; 1098 if (widgetIsOnscreenToplevelWindow(oldToplevel) && GTK_WINDOW(oldToplevel) == priv->toplevelOnScreenWindow) { 1099 webkitWebViewBaseSetToplevelOnScreenWindow(WEBKIT_WEB_VIEW_BASE(widget), nullptr); 1100 return; 1101 } 1102 1103 if (!oldToplevel) { 1104 GtkWidget* toplevel = gtk_widget_get_toplevel(widget); 1105 if (widgetIsOnscreenToplevelWindow(toplevel)) 1106 webkitWebViewBaseSetToplevelOnScreenWindow(WEBKIT_WEB_VIEW_BASE(widget), GTK_WINDOW(toplevel)); 1107 } 1079 1108 } 1080 1109 … … 1135 1164 #endif // ENABLE(DRAG_SUPPORT) 1136 1165 widgetClass->get_accessible = webkitWebViewBaseGetAccessible; 1137 widgetClass-> parent_set = webkitWebViewBaseParentSet;1166 widgetClass->hierarchy_changed = webkitWebViewBaseHierarchyChanged; 1138 1167 widgetClass->destroy = webkitWebViewBaseDestroy; 1139 1168 -
releases/WebKitGTK/webkit-2.12/Source/WebKit2/UIProcess/cairo/BackingStoreCairo.cpp
r192140 r197117 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.