WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patched for 2.10
ac-tearing-2.10.patch (text/plain), 24.71 KB, created by
Carlos Garcia Campos
on 2016-02-24 04:37:57 PST
(
hide
)
Description:
Patched for 2.10
Filename:
MIME Type:
Creator:
Carlos Garcia Campos
Created:
2016-02-24 04:37:57 PST
Size:
24.71 KB
patch
obsolete
>From c50368a7214ac827f3a7c5cedbc68ed102c2e9fc Mon Sep 17 00:00:00 2001 >From: "carlosgc@webkit.org" > <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc> >Date: Wed, 3 Feb 2016 11:04:33 +0000 >Subject: [PATCH 1/2] [GTK] Reduce IPC traffic due to view state changes > https://bugs.webkit.org/show_bug.cgi?id=153745 > >Reviewed by Sergio Villar Senin. > >Very often view state changes happen one after another in a very >short period of time, even in the same run loop iteration. For >example, when you switch to the web view window, the view is >focused and the active window flag changes as well. In that case >we are sending two messages to the web process and the page >updates its status according to the new flags in two steps. So, we >could group all state changes happening in the same run loop >iteration and notify about them all in the next iteration. This >also prevents unnecessary changes of state when we quickly go back >to a previous state, for example in focus follows mouse >configurations if you move the mouse outside the window and then >inside the window again quickly. > >* UIProcess/API/gtk/WebKitWebViewBase.cpp: >(_WebKitWebViewBasePrivate::_WebKitWebViewBasePrivate): Use >VirewState::Flags to keep the web view state instead of >boolean, and also to keep the flags that need to be updated. Use a >timer to update web view state flags. >(_WebKitWebViewBasePrivate::updateViewStateTimerFired): Call >WebPageProxy::viewStateDidChange() and reset the flags that need >to be updated. >(webkitWebViewBaseScheduleUpdateViewState): Update the flags that >need to be updated and schedule the timer if it's not active. >(toplevelWindowFocusInEvent): Use the flags and schedule an update. >(toplevelWindowFocusOutEvent): Ditto. >(toplevelWindowStateEvent): Also mark the view as hidden when minimized. >(webkitWebViewBaseSetToplevelOnScreenWindow): Connect to >window-state-event instead of deprecated visibility-notify-event. >(webkitWebViewBaseMap): Use the flags and schedule an update. >(webkitWebViewBaseUnmap): Ditto. >(webkitWebViewBaseSetFocus): Ditto. >(webkitWebViewBaseIsInWindowActive): Use the flags. >(webkitWebViewBaseIsFocused): Ditto >(webkitWebViewBaseIsVisible): Ditto. >(webkitWebViewBaseIsInWindow): Removed this since it was unused. >* UIProcess/API/gtk/WebKitWebViewBasePrivate.h: > >git-svn-id: http://svn.webkit.org/repository/webkit/trunk@196062 268f45cc-cd09-0410-ab3c-d52691b4dbfc >--- > .../UIProcess/API/gtk/WebKitWebViewBase.cpp | 151 +++++++++++++-------- > .../UIProcess/API/gtk/WebKitWebViewBasePrivate.h | 1 - > 2 files changed, 93 insertions(+), 59 deletions(-) > >diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp >index 93a52bf..881445d 100644 >--- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp >+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp >@@ -149,6 +149,19 @@ typedef HashMap<GtkWidget*, IntRect> WebKitWebViewChildrenMap; > typedef HashMap<uint32_t, GUniquePtr<GdkEvent>> TouchEventsMap; > > struct _WebKitWebViewBasePrivate { >+ _WebKitWebViewBasePrivate() >+ : updateViewStateTimer(RunLoop::main(), this, &_WebKitWebViewBasePrivate::updateViewStateTimerFired) >+ { >+ } >+ >+ void updateViewStateTimerFired() >+ { >+ if (!pageProxy) >+ return; >+ pageProxy->viewStateDidChange(viewStateFlagsToUpdate); >+ viewStateFlagsToUpdate = ViewState::NoFlags; >+ } >+ > WebKitWebViewChildrenMap children; > std::unique_ptr<PageClientImpl> pageClient; > RefPtr<WebPageProxy> pageProxy; >@@ -170,13 +183,12 @@ struct _WebKitWebViewBasePrivate { > GtkWindow* toplevelOnScreenWindow; > unsigned long toplevelFocusInEventID; > unsigned long toplevelFocusOutEventID; >- unsigned long toplevelVisibilityEventID; >+ unsigned long toplevelWindowStateEventID; > > // View State. >- bool isInWindowActive : 1; >- bool isFocused : 1; >- bool isVisible : 1; >- bool isWindowVisible : 1; >+ ViewState::Flags viewState; >+ ViewState::Flags viewStateFlagsToUpdate; >+ RunLoop::Timer<WebKitWebViewBasePrivate> updateViewStateTimer; > > WebKitWebViewBaseDownloadRequestHandler downloadHandler; > >@@ -204,13 +216,24 @@ struct _WebKitWebViewBasePrivate { > > WEBKIT_DEFINE_TYPE(WebKitWebViewBase, webkit_web_view_base, GTK_TYPE_CONTAINER) > >+static void webkitWebViewBaseScheduleUpdateViewState(WebKitWebViewBase* webViewBase, ViewState::Flags flagsToUpdate) >+{ >+ WebKitWebViewBasePrivate* priv = webViewBase->priv; >+ priv->viewStateFlagsToUpdate |= flagsToUpdate; >+ if (priv->updateViewStateTimer.isActive()) >+ return; >+ >+ priv->updateViewStateTimer.startOneShot(0); >+} >+ > static gboolean toplevelWindowFocusInEvent(GtkWidget*, GdkEventFocus*, WebKitWebViewBase* webViewBase) > { > WebKitWebViewBasePrivate* priv = webViewBase->priv; >- if (!priv->isInWindowActive) { >- priv->isInWindowActive = true; >- priv->pageProxy->viewStateDidChange(ViewState::WindowIsActive); >- } >+ if (priv->viewState & ViewState::WindowIsActive) >+ return FALSE; >+ >+ priv->viewState |= ViewState::WindowIsActive; >+ webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::WindowIsActive); > > return FALSE; > } >@@ -218,22 +241,30 @@ static gboolean toplevelWindowFocusInEvent(GtkWidget*, GdkEventFocus*, WebKitWeb > static gboolean toplevelWindowFocusOutEvent(GtkWidget*, GdkEventFocus*, WebKitWebViewBase* webViewBase) > { > WebKitWebViewBasePrivate* priv = webViewBase->priv; >- if (priv->isInWindowActive) { >- priv->isInWindowActive = false; >- priv->pageProxy->viewStateDidChange(ViewState::WindowIsActive); >- } >+ if (!(priv->viewState & ViewState::WindowIsActive)) >+ return FALSE; >+ >+ priv->viewState &= ~ViewState::WindowIsActive; >+ webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::WindowIsActive); > > return FALSE; > } > >-static gboolean toplevelWindowVisibilityEvent(GtkWidget*, GdkEventVisibility* visibilityEvent, WebKitWebViewBase* webViewBase) >+static gboolean toplevelWindowStateEvent(GtkWidget*, GdkEventWindowState* event, WebKitWebViewBase* webViewBase) > { > WebKitWebViewBasePrivate* priv = webViewBase->priv; >- bool isWindowVisible = visibilityEvent->state != GDK_VISIBILITY_FULLY_OBSCURED; >- if (priv->isWindowVisible != isWindowVisible) { >- priv->isWindowVisible = isWindowVisible; >- priv->pageProxy->viewStateDidChange(ViewState::IsVisible); >- } >+ if (!(event->changed_mask & GDK_WINDOW_STATE_ICONIFIED)) >+ return FALSE; >+ >+ bool visible = !(event->new_window_state & GDK_WINDOW_STATE_ICONIFIED); >+ if ((visible && priv->viewState & ViewState::IsVisible) || (!visible && !(priv->viewState & ViewState::IsVisible))) >+ return FALSE; >+ >+ if (visible) >+ priv->viewState |= ViewState::IsVisible; >+ else >+ priv->viewState &= ~ViewState::IsVisible; >+ webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsVisible); > > return FALSE; > } >@@ -252,13 +283,16 @@ static void webkitWebViewBaseSetToplevelOnScreenWindow(WebKitWebViewBase* webVie > g_signal_handler_disconnect(priv->toplevelOnScreenWindow, priv->toplevelFocusOutEventID); > priv->toplevelFocusOutEventID = 0; > } >- if (priv->toplevelVisibilityEventID) { >- g_signal_handler_disconnect(priv->toplevelOnScreenWindow, priv->toplevelVisibilityEventID); >- priv->toplevelVisibilityEventID = 0; >+ if (priv->toplevelWindowStateEventID) { >+ g_signal_handler_disconnect(priv->toplevelOnScreenWindow, priv->toplevelWindowStateEventID); >+ priv->toplevelWindowStateEventID = 0; > } > > priv->toplevelOnScreenWindow = window; >- priv->pageProxy->viewStateDidChange(ViewState::IsInWindow); >+ if (!(priv->viewState & ViewState::IsInWindow)) { >+ priv->viewState |= ViewState::IsInWindow; >+ webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsInWindow); >+ } > if (!priv->toplevelOnScreenWindow) > return; > >@@ -268,9 +302,8 @@ static void webkitWebViewBaseSetToplevelOnScreenWindow(WebKitWebViewBase* webVie > priv->toplevelFocusOutEventID = > g_signal_connect(priv->toplevelOnScreenWindow, "focus-out-event", > G_CALLBACK(toplevelWindowFocusOutEvent), webViewBase); >- priv->toplevelVisibilityEventID = >- g_signal_connect(priv->toplevelOnScreenWindow, "visibility-notify-event", >- G_CALLBACK(toplevelWindowVisibilityEvent), webViewBase); >+ priv->toplevelWindowStateEventID = >+ g_signal_connect(priv->toplevelOnScreenWindow, "window-state-event", G_CALLBACK(toplevelWindowStateEvent), webViewBase); > } > > static void webkitWebViewBaseRealize(GtkWidget* widget) >@@ -626,21 +659,24 @@ static void webkitWebViewBaseMap(GtkWidget* widget) > > WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget); > WebKitWebViewBasePrivate* priv = webViewBase->priv; >- if (!priv->isVisible) { >- priv->isVisible = true; >- priv->pageProxy->viewStateDidChange(ViewState::IsVisible); >- } >+ if (priv->viewState & ViewState::IsVisible) >+ return; >+ >+ priv->viewState |= ViewState::IsVisible; >+ webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsVisible); > } > > static void webkitWebViewBaseUnmap(GtkWidget* widget) > { > GTK_WIDGET_CLASS(webkit_web_view_base_parent_class)->unmap(widget); > >- WebKitWebViewBasePrivate* priv = WEBKIT_WEB_VIEW_BASE(widget)->priv; >- if (priv->isVisible) { >- priv->isVisible = false; >- priv->pageProxy->viewStateDidChange(ViewState::IsVisible); >- } >+ WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget); >+ WebKitWebViewBasePrivate* priv = webViewBase->priv; >+ if (!(priv->viewState & ViewState::IsVisible)) >+ return; >+ >+ priv->viewState &= ~ViewState::IsVisible; >+ webkitWebViewBaseScheduleUpdateViewState(webViewBase, ViewState::IsVisible); > } > > static gboolean webkitWebViewBaseFocusInEvent(GtkWidget* widget, GdkEventFocus* event) >@@ -1333,47 +1369,46 @@ GdkEvent* webkitWebViewBaseTakeContextMenuEvent(WebKitWebViewBase* webkitWebView > void webkitWebViewBaseSetFocus(WebKitWebViewBase* webViewBase, bool focused) > { > WebKitWebViewBasePrivate* priv = webViewBase->priv; >- if (priv->isFocused == focused) >+ if ((focused && priv->viewState & ViewState::IsFocused) || (!focused && !(priv->viewState & ViewState::IsFocused))) > return; > >- unsigned viewStateFlags = ViewState::IsFocused; >- priv->isFocused = focused; >- >- // If the view has received the focus and the window is not active >- // mark the current window as active now. This can happen if the >- // toplevel window is a GTK_WINDOW_POPUP and the focus has been >- // set programatically like WebKitTestRunner does, because POPUP >- // can't be focused. >- if (priv->isFocused && !priv->isInWindowActive) { >- priv->isInWindowActive = true; >- viewStateFlags |= ViewState::WindowIsActive; >- } >- priv->pageProxy->viewStateDidChange(viewStateFlags); >+ ViewState::Flags flagsToUpdate = ViewState::IsFocused; >+ if (focused) { >+ priv->viewState |= ViewState::IsFocused; >+ >+ // If the view has received the focus and the window is not active >+ // mark the current window as active now. This can happen if the >+ // toplevel window is a GTK_WINDOW_POPUP and the focus has been >+ // set programatically like WebKitTestRunner does, because POPUP >+ // can't be focused. >+ if (!(priv->viewState & ViewState::WindowIsActive)) { >+ priv->viewState |= ViewState::WindowIsActive; >+ flagsToUpdate |= ViewState::WindowIsActive; >+ } >+ } else >+ priv->viewState &= ~ViewState::IsFocused; >+ >+ webkitWebViewBaseScheduleUpdateViewState(webViewBase, flagsToUpdate); > } > > bool webkitWebViewBaseIsInWindowActive(WebKitWebViewBase* webViewBase) > { >- return webViewBase->priv->isInWindowActive; >+ return webViewBase->priv->viewState & ViewState::WindowIsActive; > } > > bool webkitWebViewBaseIsFocused(WebKitWebViewBase* webViewBase) > { >- return webViewBase->priv->isFocused; >+ return webViewBase->priv->viewState & ViewState::IsFocused; > } > > bool webkitWebViewBaseIsVisible(WebKitWebViewBase* webViewBase) > { >- return webViewBase->priv->isVisible; >+ return webViewBase->priv->viewState & ViewState::IsVisible; > } > > bool webkitWebViewBaseIsInWindow(WebKitWebViewBase* webViewBase) > { >- return webViewBase->priv->toplevelOnScreenWindow; >-} >- >-bool webkitWebViewBaseIsWindowVisible(WebKitWebViewBase* webViewBase) >-{ >- return webViewBase->priv->isWindowVisible; >+ return webViewBase->priv->viewState & ViewState::IsInWindow; > } > > void webkitWebViewBaseSetDownloadRequestHandler(WebKitWebViewBase* webViewBase, WebKitWebViewBaseDownloadRequestHandler downloadHandler) >diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h >index 2eb3a13..f521d22 100644 >--- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h >+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h >@@ -59,7 +59,6 @@ bool webkitWebViewBaseIsInWindowActive(WebKitWebViewBase*); > bool webkitWebViewBaseIsFocused(WebKitWebViewBase*); > bool webkitWebViewBaseIsVisible(WebKitWebViewBase*); > bool webkitWebViewBaseIsInWindow(WebKitWebViewBase*); >-bool webkitWebViewBaseIsWindowVisible(WebKitWebViewBase*); > > typedef void (*WebKitWebViewBaseDownloadRequestHandler) (WebKitWebViewBase*, WebKit::DownloadProxy*); > void webkitWebViewBaseSetDownloadRequestHandler(WebKitWebViewBase*, WebKitWebViewBaseDownloadRequestHandler); >-- >2.7.0 > >From 33cc86e89a7096a8cc3773e962836d1543644dd8 Mon Sep 17 00:00:00 2001 >From: Carlos Garcia Campos <cgarcia@igalia.com> >Date: Tue, 23 Feb 2016 11:09:28 +0100 >Subject: [PATCH 2/2] [GTK] Tearing when entering AC mode > https://bugs.webkit.org/show_bug.cgi?id=150955 > >Reviewed by NOBODY (OOPS!). > >Source/WebCore: > >* platform/gtk/GtkUtilities.cpp: >(WebCore::widgetIsOnscreenToplevelWindow): Allow passing nullptr. > >Source/WebKit2: > >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. >--- > Source/WebCore/platform/gtk/GtkUtilities.cpp | 2 +- > .../UIProcess/API/gtk/WebKitWebViewBase.cpp | 63 ++++++++++++++++------ > .../WebKit2/UIProcess/cairo/BackingStoreCairo.cpp | 6 +-- > 3 files changed, 50 insertions(+), 21 deletions(-) > >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/UIProcess/API/gtk/WebKitWebViewBase.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp >index 881445d..6b7a13c 100644 >--- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp >+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp >@@ -226,8 +226,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; >@@ -289,12 +293,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", >@@ -304,6 +318,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) >@@ -372,10 +387,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) >@@ -659,11 +670,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) >@@ -1061,10 +1081,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) >@@ -1123,7 +1152,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 884ee14..857040c 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) >-- >2.7.0 >
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
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 150955
:
264886
|
264887
|
264889
|
272003
| 272111