browser(webkit): fix geo crash, exit main loop upon close (#435)
This commit is contained in:
parent
9c90eed90c
commit
e13161c894
|
|
@ -1 +1 @@
|
|||
1076
|
||||
1077
|
||||
|
|
|
|||
|
|
@ -4854,7 +4854,7 @@ index 2bdb8b9e7256f22096ebaa5d51959aa52389ca0a..2141d9d17497861a6c711f99306de109
|
|||
|
||||
diff --git a/Source/WebKit/UIProcess/API/glib/WebKitBrowserInspector.cpp b/Source/WebKit/UIProcess/API/glib/WebKitBrowserInspector.cpp
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..4514f00de0b27620cd170d6ed9b361a3e1506fb1
|
||||
index 0000000000000000000000000000000000000000..70081db72e035ca99c0279ab02da5cfed9256c57
|
||||
--- /dev/null
|
||||
+++ b/Source/WebKit/UIProcess/API/glib/WebKitBrowserInspector.cpp
|
||||
@@ -0,0 +1,136 @@
|
||||
|
|
@ -4988,10 +4988,10 @@ index 0000000000000000000000000000000000000000..4514f00de0b27620cd170d6ed9b361a3
|
|||
+ * Creates browser inspector and configures pipe handler to communicate with
|
||||
+ * the parent process.
|
||||
+ */
|
||||
+void webkit_browser_inspector_initialize_pipe(void)
|
||||
+void webkit_browser_inspector_initialize_pipe(GMainLoop* mainLoop)
|
||||
+{
|
||||
+#if ENABLE(REMOTE_INSPECTOR)
|
||||
+ WebKit::initializeBrowserInspectorPipe(makeUnique<WebKit::InspectorBrowserAgentClientGlib>());
|
||||
+ WebKit::initializeBrowserInspectorPipe(makeUnique<WebKit::InspectorBrowserAgentClientGlib>(mainLoop));
|
||||
+#endif
|
||||
+}
|
||||
diff --git a/Source/WebKit/UIProcess/API/glib/WebKitBrowserInspectorPrivate.h b/Source/WebKit/UIProcess/API/glib/WebKitBrowserInspectorPrivate.h
|
||||
|
|
@ -5179,7 +5179,7 @@ index b1252daf7423bb66a177b5d028563e389b73802a..3edc383f6d7bbc1b43a7b4937eee03c4
|
|||
webkitWebViewBaseForwardNextKeyEvent(webkitWebViewBase);
|
||||
diff --git a/Source/WebKit/UIProcess/API/gtk/WebKitBrowserInspector.h b/Source/WebKit/UIProcess/API/gtk/WebKitBrowserInspector.h
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..f933c3479cdb49544fe7c1b22c8b00b052af7fe5
|
||||
index 0000000000000000000000000000000000000000..a51cfebc270ca5a91cd94645eeeb005ba9a67caf
|
||||
--- /dev/null
|
||||
+++ b/Source/WebKit/UIProcess/API/gtk/WebKitBrowserInspector.h
|
||||
@@ -0,0 +1,79 @@
|
||||
|
|
@ -5257,7 +5257,7 @@ index 0000000000000000000000000000000000000000..f933c3479cdb49544fe7c1b22c8b00b0
|
|||
+webkit_browser_inspector_get_default (void);
|
||||
+
|
||||
+WEBKIT_API void
|
||||
+webkit_browser_inspector_initialize_pipe (void);
|
||||
+webkit_browser_inspector_initialize_pipe (GMainLoop*);
|
||||
+
|
||||
+G_END_DECLS
|
||||
+
|
||||
|
|
@ -5276,7 +5276,7 @@ index 930b17b6629e04d0dfa2222bbc3217877c6e1812..395462e5f01c195231e9296d1204167c
|
|||
#include <webkit2/WebKitContextMenuItem.h>
|
||||
diff --git a/Source/WebKit/UIProcess/API/wpe/WebKitBrowserInspector.h b/Source/WebKit/UIProcess/API/wpe/WebKitBrowserInspector.h
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..b9392bc9f232f1f8a5be1e9668ec31e11bd8e3f8
|
||||
index 0000000000000000000000000000000000000000..6dffa4fa10a9a64f778a0a77c760c2e76b2f9968
|
||||
--- /dev/null
|
||||
+++ b/Source/WebKit/UIProcess/API/wpe/WebKitBrowserInspector.h
|
||||
@@ -0,0 +1,79 @@
|
||||
|
|
@ -5354,7 +5354,7 @@ index 0000000000000000000000000000000000000000..b9392bc9f232f1f8a5be1e9668ec31e1
|
|||
+webkit_browser_inspector_get_default (void);
|
||||
+
|
||||
+WEBKIT_API void
|
||||
+webkit_browser_inspector_initialize_pipe (void);
|
||||
+webkit_browser_inspector_initialize_pipe (GMainLoop*);
|
||||
+
|
||||
+G_END_DECLS
|
||||
+
|
||||
|
|
@ -8089,12 +8089,98 @@ index b7c955a5f3ebe5805ad7095bc06878e128d11568..ab65f14db987e4e03e0474c9127efad6
|
|||
bool m_ignoreTLSErrors { true };
|
||||
#endif
|
||||
|
||||
diff --git a/Source/WebKit/UIProcess/geoclue/GeoclueGeolocationProvider.cpp b/Source/WebKit/UIProcess/geoclue/GeoclueGeolocationProvider.cpp
|
||||
index dba2a990d15683216a6fa90a48eb30eebd3c526f..6a8afc7c206765670d25152f7b6a1aa7e5563a27 100644
|
||||
--- a/Source/WebKit/UIProcess/geoclue/GeoclueGeolocationProvider.cpp
|
||||
+++ b/Source/WebKit/UIProcess/geoclue/GeoclueGeolocationProvider.cpp
|
||||
@@ -55,10 +55,11 @@ void GeoclueGeolocationProvider::start(UpdateNotifyFunction&& updateNotifyFuncti
|
||||
m_destroyManagerLaterTimer.stop();
|
||||
m_updateNotifyFunction = WTFMove(updateNotifyFunction);
|
||||
m_isRunning = true;
|
||||
-
|
||||
if (!m_manager) {
|
||||
+ g_cancellable_cancel(m_cancellable_start.get());
|
||||
+ m_cancellable_start = adoptGRef(g_cancellable_new());
|
||||
g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, nullptr,
|
||||
- "org.freedesktop.GeoClue2", "/org/freedesktop/GeoClue2/Manager", "org.freedesktop.GeoClue2.Manager", nullptr,
|
||||
+ "org.freedesktop.GeoClue2", "/org/freedesktop/GeoClue2/Manager", "org.freedesktop.GeoClue2.Manager", m_cancellable_start.get(),
|
||||
[](GObject*, GAsyncResult* result, gpointer userData) {
|
||||
auto& provider = *static_cast<GeoclueGeolocationProvider*>(userData);
|
||||
GUniqueOutPtr<GError> error;
|
||||
@@ -84,6 +85,12 @@ void GeoclueGeolocationProvider::stop()
|
||||
m_updateNotifyFunction = nullptr;
|
||||
g_cancellable_cancel(m_cancellable.get());
|
||||
stopClient();
|
||||
+ g_cancellable_cancel(m_cancellable_start.get());
|
||||
+ m_cancellable_start = nullptr;
|
||||
+ g_cancellable_cancel(m_cancellable_setup.get());
|
||||
+ m_cancellable_setup = nullptr;
|
||||
+ g_cancellable_cancel(m_cancellable_create.get());
|
||||
+ m_cancellable_create = nullptr;
|
||||
destroyManagerLater();
|
||||
}
|
||||
|
||||
@@ -121,7 +128,9 @@ void GeoclueGeolocationProvider::setupManager(GRefPtr<GDBusProxy>&& proxy)
|
||||
return;
|
||||
}
|
||||
|
||||
- g_dbus_proxy_call(m_manager.get(), "CreateClient", nullptr, G_DBUS_CALL_FLAGS_NONE, -1, nullptr,
|
||||
+ g_cancellable_cancel(m_cancellable_setup.get());
|
||||
+ m_cancellable_setup = adoptGRef(g_cancellable_new());
|
||||
+ g_dbus_proxy_call(m_manager.get(), "CreateClient", nullptr, G_DBUS_CALL_FLAGS_NONE, -1, m_cancellable_setup.get(),
|
||||
[](GObject* manager, GAsyncResult* result, gpointer userData) {
|
||||
auto& provider = *static_cast<GeoclueGeolocationProvider*>(userData);
|
||||
GUniqueOutPtr<GError> error;
|
||||
@@ -143,8 +152,10 @@ void GeoclueGeolocationProvider::createClient(const char* clientPath)
|
||||
return;
|
||||
}
|
||||
|
||||
+ g_cancellable_cancel(m_cancellable_create.get());
|
||||
+ m_cancellable_create = adoptGRef(g_cancellable_new());
|
||||
g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, nullptr,
|
||||
- "org.freedesktop.GeoClue2", clientPath, "org.freedesktop.GeoClue2.Client", nullptr,
|
||||
+ "org.freedesktop.GeoClue2", clientPath, "org.freedesktop.GeoClue2.Client", m_cancellable_create.get(),
|
||||
[](GObject*, GAsyncResult* result, gpointer userData) {
|
||||
auto& provider = *static_cast<GeoclueGeolocationProvider*>(userData);
|
||||
GUniqueOutPtr<GError> error;
|
||||
@@ -190,6 +201,7 @@ void GeoclueGeolocationProvider::startClient()
|
||||
|
||||
g_signal_connect(m_client.get(), "g-signal", G_CALLBACK(clientLocationUpdatedCallback), this);
|
||||
|
||||
+ g_cancellable_cancel(m_cancellable.get());
|
||||
m_cancellable = adoptGRef(g_cancellable_new());
|
||||
g_dbus_proxy_call(m_client.get(), "Start", nullptr, G_DBUS_CALL_FLAGS_NONE, -1, m_cancellable.get(),
|
||||
[](GObject* client, GAsyncResult* result, gpointer userData) {
|
||||
@@ -282,7 +294,8 @@ void GeoclueGeolocationProvider::locationUpdated(GRefPtr<GDBusProxy>&& proxy)
|
||||
|
||||
void GeoclueGeolocationProvider::didFail(CString errorMessage)
|
||||
{
|
||||
- m_updateNotifyFunction({ }, errorMessage);
|
||||
+ if (m_updateNotifyFunction)
|
||||
+ m_updateNotifyFunction({ }, errorMessage);
|
||||
}
|
||||
|
||||
} // namespace WebKit
|
||||
diff --git a/Source/WebKit/UIProcess/geoclue/GeoclueGeolocationProvider.h b/Source/WebKit/UIProcess/geoclue/GeoclueGeolocationProvider.h
|
||||
index 31d29091985f34a65134a2b0e7cb3ace1dae441d..571ceac8a4b291fa6e91eb8b17065c0aba908ac3 100644
|
||||
--- a/Source/WebKit/UIProcess/geoclue/GeoclueGeolocationProvider.h
|
||||
+++ b/Source/WebKit/UIProcess/geoclue/GeoclueGeolocationProvider.h
|
||||
@@ -71,6 +71,9 @@ private:
|
||||
GRefPtr<GDBusProxy> m_manager;
|
||||
GRefPtr<GDBusProxy> m_client;
|
||||
GRefPtr<GCancellable> m_cancellable;
|
||||
+ GRefPtr<GCancellable> m_cancellable_start;
|
||||
+ GRefPtr<GCancellable> m_cancellable_setup;
|
||||
+ GRefPtr<GCancellable> m_cancellable_create;
|
||||
UpdateNotifyFunction m_updateNotifyFunction;
|
||||
RunLoop::Timer<GeoclueGeolocationProvider> m_destroyManagerLaterTimer;
|
||||
};
|
||||
diff --git a/Source/WebKit/UIProcess/glib/InspectorBrowserAgentClientGLib.cpp b/Source/WebKit/UIProcess/glib/InspectorBrowserAgentClientGLib.cpp
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..92a1eb339c2b760e9c5e84dc76fe323845bd81ac
|
||||
index 0000000000000000000000000000000000000000..6b7cc61fff69ea639f1ed6d2a824e4a765e5e80c
|
||||
--- /dev/null
|
||||
+++ b/Source/WebKit/UIProcess/glib/InspectorBrowserAgentClientGLib.cpp
|
||||
@@ -0,0 +1,125 @@
|
||||
@@ -0,0 +1,131 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2019 Microsoft Corporation.
|
||||
+ *
|
||||
|
|
@ -8159,7 +8245,8 @@ index 0000000000000000000000000000000000000000..92a1eb339c2b760e9c5e84dc76fe3238
|
|||
+ page->closePage();
|
||||
+}
|
||||
+
|
||||
+InspectorBrowserAgentClientGlib::InspectorBrowserAgentClientGlib()
|
||||
+InspectorBrowserAgentClientGlib::InspectorBrowserAgentClientGlib(GMainLoop* mainLoop)
|
||||
+ : m_mainLoop(mainLoop)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
|
|
@ -8186,7 +8273,12 @@ index 0000000000000000000000000000000000000000..92a1eb339c2b760e9c5e84dc76fe3238
|
|||
+{
|
||||
+ closeAllPages(Optional<PAL::SessionID>());
|
||||
+ m_idToContext.clear();
|
||||
+ // FIXME(yurys): call g_main_loop_quit() ?
|
||||
+#if PLATFORM(GTK)
|
||||
+ gtk_main_quit();
|
||||
+#else
|
||||
+ if (g_main_loop_quit)
|
||||
+ g_main_loop_quit(m_mainLoop);
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static PAL::SessionID sessionIDFromContext(WebKitWebContext* context)
|
||||
|
|
@ -8222,10 +8314,10 @@ index 0000000000000000000000000000000000000000..92a1eb339c2b760e9c5e84dc76fe3238
|
|||
+#endif // ENABLE(REMOTE_INSPECTOR)
|
||||
diff --git a/Source/WebKit/UIProcess/glib/InspectorBrowserAgentClientGLib.h b/Source/WebKit/UIProcess/glib/InspectorBrowserAgentClientGLib.h
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..27c8a4dfb0008bcf190157a0b8a72b7282abd517
|
||||
index 0000000000000000000000000000000000000000..6fcadb97ebe89699f29afc4dcac6065dbade9a3b
|
||||
--- /dev/null
|
||||
+++ b/Source/WebKit/UIProcess/glib/InspectorBrowserAgentClientGLib.h
|
||||
@@ -0,0 +1,58 @@
|
||||
@@ -0,0 +1,59 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2019 Microsoft Corporation.
|
||||
+ *
|
||||
|
|
@ -8267,7 +8359,7 @@ index 0000000000000000000000000000000000000000..27c8a4dfb0008bcf190157a0b8a72b72
|
|||
+class InspectorBrowserAgentClientGlib : public InspectorBrowserAgentClient {
|
||||
+ WTF_MAKE_FAST_ALLOCATED;
|
||||
+public:
|
||||
+ InspectorBrowserAgentClientGlib();
|
||||
+ InspectorBrowserAgentClientGlib(GMainLoop* mainLoop);
|
||||
+ ~InspectorBrowserAgentClientGlib() override = default;
|
||||
+
|
||||
+ RefPtr<WebPageProxy> createPage(WTF::String& error, PAL::SessionID) override;
|
||||
|
|
@ -8279,6 +8371,7 @@ index 0000000000000000000000000000000000000000..27c8a4dfb0008bcf190157a0b8a72b72
|
|||
+ WebKitWebContext* findContext(WTF::String& error, PAL::SessionID);
|
||||
+
|
||||
+ HashMap<PAL::SessionID, GRefPtr<WebKitWebContext>> m_idToContext;
|
||||
+ GMainLoop* m_mainLoop;
|
||||
+};
|
||||
+
|
||||
+} // namespace API
|
||||
|
|
@ -9631,7 +9724,7 @@ index 1570d65effb5d601ee3c44a2a7461436f4691c2c..456f96cf589320efa70a76f76e230b67
|
|||
|
||||
typedef struct _BrowserWindow BrowserWindow;
|
||||
diff --git a/Tools/MiniBrowser/gtk/main.c b/Tools/MiniBrowser/gtk/main.c
|
||||
index 4c5147dcd38a53e2feaeaae0fce38f92dc60eba6..be501274061102f805c43df37a67e4a1cf6d5494 100644
|
||||
index 4c5147dcd38a53e2feaeaae0fce38f92dc60eba6..85d98782b2beef897221659631384ef379dfe87f 100644
|
||||
--- a/Tools/MiniBrowser/gtk/main.c
|
||||
+++ b/Tools/MiniBrowser/gtk/main.c
|
||||
@@ -53,6 +53,8 @@ static const char *cookiesFile;
|
||||
|
|
@ -9676,7 +9769,7 @@ index 4c5147dcd38a53e2feaeaae0fce38f92dc60eba6..be501274061102f805c43df37a67e4a1
|
|||
+ WebKitBrowserInspector* browserInspector = webkit_browser_inspector_get_default();
|
||||
+ g_signal_connect(browserInspector, "create-new-page", G_CALLBACK(createNewPage), NULL);
|
||||
+
|
||||
+ webkit_browser_inspector_initialize_pipe();
|
||||
+ webkit_browser_inspector_initialize_pipe(NULL);
|
||||
+}
|
||||
+
|
||||
int main(int argc, char *argv[])
|
||||
|
|
@ -10254,7 +10347,7 @@ index 245f319abf2595e154d03e1ee8b3250d7f46aafd..9cae87b23deade7c163f34aade2b2aed
|
|||
${WPEBACKEND_FDO_INCLUDE_DIRS}
|
||||
)
|
||||
diff --git a/Tools/MiniBrowser/wpe/main.cpp b/Tools/MiniBrowser/wpe/main.cpp
|
||||
index 2d183d394123bd84545dc51f53eb9be796fb8873..7e435b9b9bb3240042269e2ec47b77205de60ba1 100644
|
||||
index 2d183d394123bd84545dc51f53eb9be796fb8873..ecc8708bcfb51dcc8f55a4fe3115c417d971600c 100644
|
||||
--- a/Tools/MiniBrowser/wpe/main.cpp
|
||||
+++ b/Tools/MiniBrowser/wpe/main.cpp
|
||||
@@ -25,7 +25,7 @@
|
||||
|
|
@ -10291,7 +10384,7 @@ index 2d183d394123bd84545dc51f53eb9be796fb8873..7e435b9b9bb3240042269e2ec47b7720
|
|||
return std::make_unique<WPEToolingBackends::WindowViewBackend>(width, height);
|
||||
}
|
||||
|
||||
@@ -172,6 +174,52 @@ static WebKitWebView* createWebView(WebKitWebView* webView, WebKitNavigationActi
|
||||
@@ -172,6 +174,46 @@ static WebKitWebView* createWebView(WebKitWebView* webView, WebKitNavigationActi
|
||||
return newWebView;
|
||||
}
|
||||
|
||||
|
|
@ -10328,28 +10421,22 @@ index 2d183d394123bd84545dc51f53eb9be796fb8873..7e435b9b9bb3240042269e2ec47b7720
|
|||
+
|
||||
+}
|
||||
+
|
||||
+static void closeAll(WebKitBrowserInspector*, GMainLoop* mainLoop)
|
||||
+{
|
||||
+ g_main_loop_quit(mainLoop);
|
||||
+}
|
||||
+
|
||||
+static void configureBrowserInspector()
|
||||
+static void configureBrowserInspector(GMainLoop* mainLoop)
|
||||
+{
|
||||
+ WebKitBrowserInspector* browserInspector = webkit_browser_inspector_get_default();
|
||||
+ g_signal_connect(browserInspector, "create-new-page", G_CALLBACK(createNewPage), NULL);
|
||||
+ // FIXME: This signal is received only when closeAll is called. We should not rely on that.
|
||||
+ webkit_browser_inspector_initialize_pipe();
|
||||
+ webkit_browser_inspector_initialize_pipe(mainLoop);
|
||||
+}
|
||||
+
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#if ENABLE_DEVELOPER_MODE
|
||||
@@ -280,6 +328,9 @@ int main(int argc, char *argv[])
|
||||
@@ -280,6 +322,9 @@ int main(int argc, char *argv[])
|
||||
delete static_cast<WPEToolingBackends::ViewBackend*>(data);
|
||||
}, backend.release());
|
||||
|
||||
+ if (inspectorPipe)
|
||||
+ configureBrowserInspector();
|
||||
+ configureBrowserInspector(loop);
|
||||
+
|
||||
auto* webView = WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW,
|
||||
"backend", viewBackend,
|
||||
|
|
|
|||
Loading…
Reference in a new issue