WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
wk2-ac-tearing.diff (text/plain), 12.24 KB, created by
Carlos Garcia Campos
on 2016-02-23 02:15:21 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Carlos Garcia Campos
Created:
2016-02-23 02:15:21 PST
Size:
12.24 KB
patch
obsolete
>diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index ca3563a..10e2a7a 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,13 @@ >+2016-02-23 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ [GTK] Tearing when entering AC mode >+ https://bugs.webkit.org/show_bug.cgi?id=150955 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * platform/gtk/GtkUtilities.cpp: >+ (WebCore::widgetIsOnscreenToplevelWindow): Allow passing nullptr. >+ > 2016-02-22 Carlos Garcia Campos <cgarcia@igalia.com> > > REGRESSION(r195949): [GTK] Test /webkit2/WebKitWebView/insert/link is failing since r195949 >diff --git a/Source/WebCore/platform/gtk/GtkUtilities.cpp b/Source/WebCore/platform/gtk/GtkUtilities.cpp >index 9f4e17a..1dc0c14 100644 >--- a/Source/WebCore/platform/gtk/GtkUtilities.cpp >+++ b/Source/WebCore/platform/gtk/GtkUtilities.cpp >@@ -51,7 +51,7 @@ IntPoint convertWidgetPointToScreenPoint(GtkWidget* widget, const IntPoint& poin > > bool widgetIsOnscreenToplevelWindow(GtkWidget* widget) > { >- return gtk_widget_is_toplevel(widget) && GTK_IS_WINDOW(widget) && !GTK_IS_OFFSCREEN_WINDOW(widget); >+ return widget && gtk_widget_is_toplevel(widget) && GTK_IS_WINDOW(widget) && !GTK_IS_OFFSCREEN_WINDOW(widget); > } > > #if ENABLE(DEVELOPER_MODE) >diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog >index fc9cbd8..f9895af 100644 >--- a/Source/WebKit2/ChangeLog >+++ b/Source/WebKit2/ChangeLog >@@ -1,3 +1,63 @@ >+2016-02-23 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ [GTK] Tearing when entering AC mode >+ https://bugs.webkit.org/show_bug.cgi?id=150955 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ When entering accelerated compositing mode, we keep rendering the >+ non accelerated contents until we have the first frame of >+ accelerated compositing contents. When the view is created hidden, >+ for example when the browser opens a link in a new tab, the view >+ is not realized until it is mapped. The native surface handle for >+ compositing, needed by the web process to render accelerated >+ compositing contents, is not available until the view is realized, >+ because it depends on the properties of the parent. When a web >+ view is mapped for the first time, and then realized, we send the >+ native surface handle for compositing to the web process, and keep >+ rendering the non composited contents until we get the first >+ frame, but in this case we never had non composited contents and >+ we end up rendering an untinitalized surface. This sometimes just >+ produces flickering and sometimes rendering artifacts. >+ We can prevent this from happening by realizing the web view as >+ soon as possible. A GtkWidget can't be realized until it has been >+ added to a toplevel, so we can realize our view right after it is >+ added to a toplevel window, and wait until the view is actually >+ mapped to notify the web process that it has been added to a >+ window. This way can we enter accelerated compositing mode before >+ the web view is mapped, so that when mapped we don't try to paint >+ the previous contents and don't need to wait for the first frame. >+ >+ * UIProcess/API/gtk/WebKitWebViewBase.cpp: >+ (toplevelWindowFocusInEvent): Handle the case of the window being >+ hidden when receiving focus in. According to >+ gtk_window_focus_in_event, this can happen. >+ (webkitWebViewBaseSetToplevelOnScreenWindow): When the web view is >+ removed from its toplevel parent, update the IsInWindow and >+ WindowIsActive flags accordingly. When the view is added to a >+ toplevel, realize it and don't update the window flags, they will be >+ updated when the view is mapped the first time. >+ (webkitWebViewBaseMap): Also update IsInWindow and WindowIsActive >+ flags if needed. This way, if for example you open a youtube video >+ in a new tab, the video won't start playing until you visit the >+ tab, like we did when the view was realized on map. >+ (webkitWebViewBaseHierarchyChanged): Use hierarchy-changed signal >+ instead of parent-set to be notified when the view is added to or >+ removed from a toplevel. >+ (webkit_web_view_base_class_init): Implement hierarchy-changed >+ instead of parent-set. >+ (webkitWebViewBaseRealize): Do not call >+ webkitWebViewBaseSetToplevelOnScreenWindow on realize, it's now >+ webkitWebViewBaseSetToplevelOnScreenWindow the one realizing the view. >+ * UIProcess/cairo/BackingStoreCairo.cpp: >+ (WebKit::BackingStore::createBackend): Do not realize the view >+ here, it should be realized already at this point. If it's not >+ realized at this point is because it hasn't been added to a >+ toplevel and gtk_widget_realize will not work anyway. >+ (WebKit::BackingStore::paint): This is changing the cairo source >+ operator, so save/restore the cairo context to ensure it doesn't >+ affect other drawing done after this. >+ > 2016-02-21 Brian Burg <bburg@apple.com> > > Web Inspector: add 'Automation' protocol domain and generate its backend classes separately in WebKit2 >diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp >index e5f0759..32b869f 100644 >--- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp >+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp >@@ -237,8 +237,12 @@ static void webkitWebViewBaseScheduleUpdateViewState(WebKitWebViewBase* webViewB > priv->updateViewStateTimer.startOneShot(0); > } > >-static gboolean toplevelWindowFocusInEvent(GtkWidget*, GdkEventFocus*, WebKitWebViewBase* webViewBase) >+static gboolean toplevelWindowFocusInEvent(GtkWidget* widget, GdkEventFocus*, WebKitWebViewBase* webViewBase) > { >+ // Spurious focus in events can occur when the window is hidden. >+ if (!gtk_widget_get_visible(widget)) >+ return FALSE; >+ > WebKitWebViewBasePrivate* priv = webViewBase->priv; > if (priv->viewState & ViewState::WindowIsActive) > return FALSE; >@@ -300,12 +304,22 @@ static void webkitWebViewBaseSetToplevelOnScreenWindow(WebKitWebViewBase* webVie > } > > priv->toplevelOnScreenWindow = window; >- if (!(priv->viewState & ViewState::IsInWindow)) { >- priv->viewState |= ViewState::IsInWindow; >- webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsInWindow); >- } >- if (!priv->toplevelOnScreenWindow) >+ >+ if (!priv->toplevelOnScreenWindow) { >+ ViewState::Flags flagsToUpdate = 0; >+ if (priv->viewState & ViewState::IsInWindow) { >+ priv->viewState &= ~ViewState::IsInWindow; >+ flagsToUpdate |= ViewState::IsInWindow; >+ } >+ if (priv->viewState & ViewState::WindowIsActive) { >+ priv->viewState &= ~ViewState::WindowIsActive; >+ flagsToUpdate |= ViewState::IsInWindow; >+ } >+ if (flagsToUpdate) >+ webkitWebViewBaseScheduleUpdateViewState(webViewBase, flagsToUpdate); >+ > return; >+ } > > priv->toplevelFocusInEventID = > g_signal_connect(priv->toplevelOnScreenWindow, "focus-in-event", >@@ -315,6 +329,7 @@ static void webkitWebViewBaseSetToplevelOnScreenWindow(WebKitWebViewBase* webVie > G_CALLBACK(toplevelWindowFocusOutEvent), webViewBase); > priv->toplevelWindowStateEventID = > g_signal_connect(priv->toplevelOnScreenWindow, "window-state-event", G_CALLBACK(toplevelWindowStateEvent), webViewBase); >+ gtk_widget_realize(GTK_WIDGET(webViewBase)); > } > > static void webkitWebViewBaseRealize(GtkWidget* widget) >@@ -383,10 +398,6 @@ static void webkitWebViewBaseRealize(GtkWidget* widget) > gtk_style_context_set_background(gtk_widget_get_style_context(widget), window); > > gtk_im_context_set_client_window(priv->inputMethodFilter.context(), window); >- >- GtkWidget* toplevel = gtk_widget_get_toplevel(widget); >- if (widgetIsOnscreenToplevelWindow(toplevel)) >- webkitWebViewBaseSetToplevelOnScreenWindow(webView, GTK_WINDOW(toplevel)); > } > > static void webkitWebViewBaseUnrealize(GtkWidget* widget) >@@ -670,11 +681,20 @@ static void webkitWebViewBaseMap(GtkWidget* widget) > > WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget); > WebKitWebViewBasePrivate* priv = webViewBase->priv; >- if (priv->viewState & ViewState::IsVisible) >+ ViewState::Flags flagsToUpdate = 0; >+ if (!(priv->viewState & ViewState::IsVisible)) >+ flagsToUpdate |= ViewState::IsVisible; >+ if (priv->toplevelOnScreenWindow) { >+ if (!(priv->viewState & ViewState::IsInWindow)) >+ flagsToUpdate |= ViewState::IsInWindow; >+ if (gtk_window_is_active(GTK_WINDOW(priv->toplevelOnScreenWindow)) && !(priv->viewState & ViewState::WindowIsActive)) >+ flagsToUpdate |= ViewState::WindowIsActive; >+ } >+ if (!flagsToUpdate) > return; > >- priv->viewState |= ViewState::IsVisible; >- webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsVisible); >+ priv->viewState |= flagsToUpdate; >+ webkitWebViewBaseScheduleUpdateViewState(webViewBase, flagsToUpdate); > } > > static void webkitWebViewBaseUnmap(GtkWidget* widget) >@@ -1072,10 +1092,19 @@ static gboolean webkitWebViewBaseDragDrop(GtkWidget* widget, GdkDragContext* con > } > #endif // ENABLE(DRAG_SUPPORT) > >-static void webkitWebViewBaseParentSet(GtkWidget* widget, GtkWidget* /* oldParent */) >+static void webkitWebViewBaseHierarchyChanged(GtkWidget* widget, GtkWidget* oldToplevel) > { >- if (!gtk_widget_get_parent(widget)) >- webkitWebViewBaseSetToplevelOnScreenWindow(WEBKIT_WEB_VIEW_BASE(widget), 0); >+ WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(widget)->priv; >+ if (widgetIsOnscreenToplevelWindow(oldToplevel) && GTK_WINDOW(oldToplevel) == priv->toplevelOnScreenWindow) { >+ webkitWebViewBaseSetToplevelOnScreenWindow(WEBKIT_WEB_VIEW_BASE(widget), nullptr); >+ return; >+ } >+ >+ if (!oldToplevel) { >+ GtkWidget* toplevel = gtk_widget_get_toplevel(widget); >+ if (widgetIsOnscreenToplevelWindow(toplevel)) >+ webkitWebViewBaseSetToplevelOnScreenWindow(WEBKIT_WEB_VIEW_BASE(widget), GTK_WINDOW(toplevel)); >+ } > } > > static gboolean webkitWebViewBaseFocus(GtkWidget* widget, GtkDirectionType direction) >@@ -1134,7 +1163,7 @@ static void webkit_web_view_base_class_init(WebKitWebViewBaseClass* webkitWebVie > widgetClass->drag_data_received = webkitWebViewBaseDragDataReceived; > #endif // ENABLE(DRAG_SUPPORT) > widgetClass->get_accessible = webkitWebViewBaseGetAccessible; >- widgetClass->parent_set = webkitWebViewBaseParentSet; >+ widgetClass->hierarchy_changed = webkitWebViewBaseHierarchyChanged; > widgetClass->destroy = webkitWebViewBaseDestroy; > > GObjectClass* gobjectClass = G_OBJECT_CLASS(webkitWebViewBaseClass); >diff --git a/Source/WebKit2/UIProcess/cairo/BackingStoreCairo.cpp b/Source/WebKit2/UIProcess/cairo/BackingStoreCairo.cpp >index 3889bd9..df4b747 100644 >--- a/Source/WebKit2/UIProcess/cairo/BackingStoreCairo.cpp >+++ b/Source/WebKit2/UIProcess/cairo/BackingStoreCairo.cpp >@@ -67,9 +67,7 @@ std::unique_ptr<BackingStoreBackendCairo> BackingStore::createBackend() > scaledSize.scale(m_deviceScaleFactor); > > #if PLATFORM(GTK) >- GtkWidget* viewWidget = m_webPageProxy.viewWidget(); >- gtk_widget_realize(viewWidget); >- RefPtr<cairo_surface_t> surface = adoptRef(gdk_window_create_similar_surface(gtk_widget_get_window(viewWidget), >+ RefPtr<cairo_surface_t> surface = adoptRef(gdk_window_create_similar_surface(gtk_widget_get_window(m_webPageProxy.viewWidget()), > CAIRO_CONTENT_COLOR_ALPHA, scaledSize.width(), scaledSize.height())); > #else > RefPtr<cairo_surface_t> surface = adoptRef(cairo_image_surface_create(CAIRO_FORMAT_ARGB32, scaledSize.width(), scaledSize.height())); >@@ -83,10 +81,12 @@ void BackingStore::paint(cairo_t* context, const IntRect& rect) > { > ASSERT(m_backend); > >+ cairo_save(context); > cairo_set_operator(context, CAIRO_OPERATOR_SOURCE); > cairo_set_source_surface(context, m_backend->surface(), 0, 0); > cairo_rectangle(context, rect.x(), rect.y(), rect.width(), rect.height()); > cairo_fill(context); >+ cairo_restore(context); > } > > void BackingStore::incorporateUpdate(ShareableBitmap* bitmap, const UpdateInfo& updateInfo)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
mcatanzaro
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 150955
:
264886
|
264887
|
264889
| 272003 |
272111