WebKit Bugzilla
Attachment 356172 Details for
Bug 192224
: [WPE] Add API to notify about frame displayed view backend callback
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
wpe-frame-displayed-api.diff (text/plain), 11.53 KB, created by
Carlos Garcia Campos
on 2018-11-30 06:47:08 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Carlos Garcia Campos
Created:
2018-11-30 06:47:08 PST
Size:
11.53 KB
patch
obsolete
>diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 42320114a3d..2c1c3a56b92 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,20 @@ >+2018-11-30 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ [WPE] Add API to notify about frame displayed view backend callback >+ https://bugs.webkit.org/show_bug.cgi?id=192224 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add API to add a callback to the view to be called when the view backend notifies that a frame has been >+ displayed. >+ >+ * UIProcess/API/glib/WebKitWebView.cpp: >+ (FrameDisplayedCallback::FrameDisplayedCallback): >+ (FrameDisplayedCallback::~FrameDisplayedCallback): >+ (webkit_web_view_add_frame_displayed_callback): >+ (webkit_web_view_remove_frame_displayed_callback): >+ * UIProcess/API/wpe/WebKitWebView.h: >+ > 2018-11-28 Carlos Garcia Campos <cgarcia@igalia.com> > > [WPE] Use new view state API from libwpe >diff --git a/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp b/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp >index 0fa4a18f89c..141012076f0 100644 >--- a/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp >+++ b/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp >@@ -71,6 +71,7 @@ > #include <WebCore/RefPtrCairo.h> > #include <WebCore/URL.h> > #include <glib/gi18n-lib.h> >+#include <wtf/SetForScope.h> > #include <wtf/glib/GRefPtr.h> > #include <wtf/glib/WTFGType.h> > #include <wtf/text/CString.h> >@@ -196,6 +197,34 @@ typedef HashMap<uint64_t, GRefPtr<GTask> > SnapshotResultsMap; > > class PageLoadStateObserver; > >+#if PLATFORM(WPE) >+static unsigned frameDisplayCallbackID; >+struct FrameDisplayedCallback { >+ FrameDisplayedCallback(WebKitFrameDisplayedCallback callback, gpointer userData = nullptr, GDestroyNotify destroyNotifyFunction = nullptr) >+ : id(++frameDisplayCallbackID) >+ , callback(callback) >+ , userData(userData) >+ , destroyNotifyFunction(destroyNotifyFunction) >+ { >+ } >+ >+ ~FrameDisplayedCallback() >+ { >+ if (destroyNotifyFunction) >+ destroyNotifyFunction(userData); >+ } >+ >+ FrameDisplayedCallback(FrameDisplayedCallback&&) = default; >+ FrameDisplayedCallback(const FrameDisplayedCallback&) = delete; >+ FrameDisplayedCallback& operator=(const FrameDisplayedCallback&) = delete; >+ >+ unsigned id { 0 }; >+ WebKitFrameDisplayedCallback callback { nullptr }; >+ gpointer userData { nullptr }; >+ GDestroyNotify destroyNotifyFunction { nullptr }; >+}; >+#endif // PLATFORM(WPE) >+ > struct _WebKitWebViewPrivate { > ~_WebKitWebViewPrivate() > { >@@ -207,6 +236,9 @@ struct _WebKitWebViewPrivate { > #if PLATFORM(WPE) > GRefPtr<WebKitWebViewBackend> backend; > std::unique_ptr<WKWPE::View> view; >+ Vector<FrameDisplayedCallback> frameDisplayedCallbacks; >+ bool inFrameDisplayed; >+ Vector<unsigned> frameDisplayedCallbacksToRemove; > #endif > > WebKitWebView* relatedView; >@@ -372,6 +404,20 @@ private: > webkitWebViewHandleDownloadRequest(m_webView, &downloadProxy); > } > >+ void frameDisplayed(WKWPE::View&) override >+ { >+ { >+ SetForScope<bool>inFrameDisplayedGuard(m_webView->priv->inFrameDisplayed, true); >+ for (const auto& callback : m_webView->priv->frameDisplayedCallbacks) >+ callback.callback(m_webView, callback.userData); >+ } >+ >+ while (!m_webView->priv->frameDisplayedCallbacksToRemove.isEmpty()) { >+ auto index = m_webView->priv->frameDisplayedCallbacksToRemove.takeLast(); >+ m_webView->priv->frameDisplayedCallbacks.remove(index); >+ } >+ } >+ > WebKitWebView* m_webView; > }; > #endif >@@ -4089,3 +4135,55 @@ void webkit_web_view_restore_session_state(WebKitWebView* webView, WebKitWebView > > getPage(webView).restoreFromSessionState(webkitWebViewSessionStateGetSessionState(state), false); > } >+ >+#if PLATFORM(WPE) >+/** >+ * webkit_web_view_add_frame_displayed_callback: >+ * @web_view: a #WebKitWebView >+ * @callback: a #WebKitFrameDisplayedCallback >+ * @user_data: (closure): user data to pass to @callback >+ * @destroy_notify: (nullable): destroy notifier for @user_data >+ * >+ * Add a callback to be called when the backend notifies that a frame has been displayed in @web_view. >+ * >+ * Returns: an identifier that should be passed to webkit_web_view_remove_frame_displayed_callback() >+ * to remove the callback. >+ * >+ * Since: 2.24 >+ */ >+unsigned webkit_web_view_add_frame_displayed_callback(WebKitWebView* webView, WebKitFrameDisplayedCallback callback, gpointer userData, GDestroyNotify destroyNotify) >+{ >+ g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0); >+ g_return_val_if_fail(callback, 0); >+ >+ webView->priv->frameDisplayedCallbacks.append(FrameDisplayedCallback(callback, userData, destroyNotify)); >+ return webView->priv->frameDisplayedCallbacks.last().id; >+} >+ >+/** >+ * webkit_web_view_remove_frame_displayed_callback: >+ * @web_view: a #WebKitWebView >+ * @id: an identifier >+ * >+ * Removes a #WebKitFrameDisplayedCallback previously added to @web_view with >+ * webkit_web_view_add_frame_displayed_callback(). >+ * >+ * Since: 2.24 >+ */ >+void webkit_web_view_remove_frame_displayed_callback(WebKitWebView* webView, unsigned id) >+{ >+ g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView)); >+ g_return_if_fail(id); >+ >+ Function<bool(const FrameDisplayedCallback&)> matchFunction = [id](const auto& item) { >+ return item.id == id; >+ }; >+ >+ if (webView->priv->inFrameDisplayed) { >+ auto index = webView->priv->frameDisplayedCallbacks.findMatching(matchFunction); >+ if (index != notFound) >+ webView->priv->frameDisplayedCallbacksToRemove.append(index); >+ } else >+ webView->priv->frameDisplayedCallbacks.removeFirstMatching(matchFunction); >+} >+#endif // PLATFORM(WPE) >diff --git a/Source/WebKit/UIProcess/API/wpe/WebKitWebView.h b/Source/WebKit/UIProcess/API/wpe/WebKitWebView.h >index 2e389fd0b3c..4102a7526d6 100644 >--- a/Source/WebKit/UIProcess/API/wpe/WebKitWebView.h >+++ b/Source/WebKit/UIProcess/API/wpe/WebKitWebView.h >@@ -166,6 +166,18 @@ typedef enum { > WEBKIT_WEB_PROCESS_EXCEEDED_MEMORY_LIMIT > } WebKitWebProcessTerminationReason; > >+/** >+ * WebKitFrameDisplayedCallback: >+ * @web_view: a #WebKitWebView >+ * @user_data: user data >+ * >+ * Callback to be called when a frame is displayed in a #webKitWebView. >+ * >+ * Since: 2.24 >+ */ >+typedef void (* WebKitFrameDisplayedCallback) (WebKitWebView *web_view, >+ gpointer user_data); >+ > struct _WebKitWebView { > GObject parent; > >@@ -495,6 +507,16 @@ WEBKIT_API void > webkit_web_view_restore_session_state (WebKitWebView *web_view, > WebKitWebViewSessionState *state); > >+WEBKIT_API guint >+webkit_web_view_add_frame_displayed_callback (WebKitWebView *web_view, >+ WebKitFrameDisplayedCallback callback, >+ gpointer user_data, >+ GDestroyNotify destroy_notify); >+ >+WEBKIT_API void >+webkit_web_view_remove_frame_displayed_callback (WebKitWebView *web_view, >+ guint id); >+ > G_END_DECLS > > #endif >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index f37dd0369cd..b71e072958d 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,16 @@ >+2018-11-30 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ [WPE] Add API to notify about frame displayed view backend callback >+ https://bugs.webkit.org/show_bug.cgi?id=192224 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add a test case to check the new API. >+ >+ * TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp: >+ (testWebViewFrameDisplayed): >+ (beforeAll): >+ > 2018-11-28 Carlos Garcia Campos <cgarcia@igalia.com> > > [WPE] Use new view state API from libwpe >diff --git a/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp b/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp >index 45ec1e5a8aa..b0d573536e2 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp >+++ b/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp >@@ -1219,6 +1219,81 @@ static void testWebViewTitleChange(WebViewTitleTest* test, gconstpointer) > g_assert_cmpstr(test->m_webViewTitles[6].data(), ==, "three"); > } > >+#if PLATFORM(WPE) >+class FrameDisplayedTest: public WebViewTest { >+public: >+ MAKE_GLIB_TEST_FIXTURE(FrameDisplayedTest); >+ >+ static void titleChangedCallback(WebKitWebView* view, GParamSpec*, WebViewTitleTest* test) >+ { >+ test->m_webViewTitles.append(webkit_web_view_get_title(view)); >+ } >+ >+ FrameDisplayedTest() >+ : m_id(webkit_web_view_add_frame_displayed_callback(m_webView, [](WebKitWebView*, gpointer userData) { >+ auto* test = static_cast<FrameDisplayedTest*>(userData); >+ if (!test->m_maxFrames) >+ return; >+ >+ if (++test->m_frameCounter == test->m_maxFrames) >+ RunLoop::main().dispatch([test] { test->quitMainLoop(); }); >+ }, this, nullptr)) >+ { >+ g_assert_cmpuint(m_id, >, 0); >+ } >+ >+ ~FrameDisplayedTest() >+ { >+ webkit_web_view_remove_frame_displayed_callback(m_webView, m_id); >+ } >+ >+ void waitUntilFramesDisplayed(unsigned framesCount = 1) >+ { >+ m_maxFrames = framesCount; >+ m_frameCounter = 0; >+ g_main_loop_run(m_mainLoop); >+ } >+ >+ unsigned m_id { 0 }; >+ unsigned m_frameCounter { 0 }; >+ unsigned m_maxFrames { 0 }; >+}; >+ >+static void testWebViewFrameDisplayed(FrameDisplayedTest* test, gconstpointer) >+{ >+ test->showInWindow(); >+ >+ test->loadHtml("<html></html>", nullptr); >+ test->waitUntilFramesDisplayed(); >+ >+ test->loadHtml("<html><head><style>@keyframes fadeIn { from { opacity: 0; } }</style></head><p style='animation: fadeIn 1s infinite alternate;'>Foo</p></html>", nullptr); >+ test->waitUntilFramesDisplayed(10); >+ >+ bool secondCallbackCalled = false; >+ auto id = webkit_web_view_add_frame_displayed_callback(test->m_webView, [](WebKitWebView*, gpointer userData) { >+ auto* secondCallbackCalled = static_cast<bool*>(userData); >+ *secondCallbackCalled = true; >+ }, &secondCallbackCalled, nullptr); >+ test->waitUntilFramesDisplayed(); >+ g_assert_true(secondCallbackCalled); >+ >+ secondCallbackCalled = false; >+ webkit_web_view_remove_frame_displayed_callback(test->m_webView, id); >+ test->waitUntilFramesDisplayed(); >+ g_assert_false(secondCallbackCalled); >+ >+ id = webkit_web_view_add_frame_displayed_callback(test->m_webView, [](WebKitWebView* webView, gpointer userData) { >+ auto* id = static_cast<unsigned*>(userData); >+ webkit_web_view_remove_frame_displayed_callback(webView, *id); >+ }, &id, [](gpointer userData) { >+ auto* id = static_cast<unsigned*>(userData); >+ *id = 0; >+ }); >+ test->waitUntilFramesDisplayed(); >+ g_assert_cmpuint(id, ==, 0); >+} >+#endif >+ > static void serverCallback(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer) > { > if (message->method != SOUP_METHOD_GET) { >@@ -1274,6 +1349,9 @@ void beforeAll() > WebViewTest::add("WebKitWebView", "preferred-size", testWebViewPreferredSize); > #endif > WebViewTitleTest::add("WebKitWebView", "title-change", testWebViewTitleChange); >+#if PLATFORM(WPE) >+ FrameDisplayedTest::add("WebKitWebView", "frame-displayed", testWebViewFrameDisplayed); >+#endif > } > > void afterAll()
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 192224
:
356172
|
357433
|
357434