diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebProcessTest.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebProcessTest.cpp')
-rw-r--r-- | Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebProcessTest.cpp | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebProcessTest.cpp b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebProcessTest.cpp index 09d0785aa..bc058693d 100644 --- a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebProcessTest.cpp +++ b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebProcessTest.cpp @@ -22,8 +22,11 @@ #include <JavaScriptCore/JSRetainPtr.h> #include <gio/gio.h> +#include <wtf/HashSet.h> #include <wtf/NeverDestroyed.h> -#include <wtf/gobject/GUniquePtr.h> +#include <wtf/glib/GUniquePtr.h> + +static HashSet<GObject*> s_watchedObjects; typedef HashMap<String, std::function<std::unique_ptr<WebProcessTest> ()>> TestsMap; static TestsMap& testsMap() @@ -34,7 +37,15 @@ static TestsMap& testsMap() void WebProcessTest::add(const String& testName, std::function<std::unique_ptr<WebProcessTest> ()> closure) { - testsMap().add(testName, std::move(closure)); + testsMap().add(testName, WTFMove(closure)); +} + +void WebProcessTest::assertObjectIsDeletedWhenTestFinishes(GObject* object) +{ + s_watchedObjects.add(object); + g_object_weak_ref(object, [](gpointer, GObject* finalizedObject) { + s_watchedObjects.remove(finalizedObject); + }, nullptr); } std::unique_ptr<WebProcessTest> WebProcessTest::create(const String& testName) @@ -53,6 +64,14 @@ static JSValueRef runTest(JSContextRef context, JSObjectRef function, JSObjectRe WebKitWebPage* webPage = WEBKIT_WEB_PAGE(JSObjectGetPrivate(thisObject)); g_assert(WEBKIT_IS_WEB_PAGE(webPage)); + // Test /WebKitDOMNode/dom-cache is an exception, because it's called 3 times, so + // the WebPage is destroyed after the third time. + if (g_str_equal(testPath.get(), "WebKitDOMNode/dom-cache")) { + static unsigned domCacheTestRunCount = 0; + if (++domCacheTestRunCount == 3) + WebProcessTest::assertObjectIsDeletedWhenTestFinishes(G_OBJECT(webPage)); + } else + WebProcessTest::assertObjectIsDeletedWhenTestFinishes(G_OBJECT(webPage)); std::unique_ptr<WebProcessTest> test = WebProcessTest::create(String::fromUTF8(testPath.get())); return JSValueMakeBoolean(context, test->runTest(g_strrstr(testPath.get(), "/") + 1, webPage)); @@ -67,6 +86,16 @@ static const JSStaticFunction webProcessTestRunnerStaticFunctions[] = static void webProcessTestRunnerFinalize(JSObjectRef object) { g_object_unref(JSObjectGetPrivate(object)); + + if (s_watchedObjects.isEmpty()) + return; + + g_print("Leaked objects in WebProcess:"); + for (const auto object : s_watchedObjects) + g_print(" %s(%p)", g_type_name_from_instance(reinterpret_cast<GTypeInstance*>(object)), object); + g_print("\n"); + + g_assert(s_watchedObjects.isEmpty()); } static void windowObjectClearedCallback(WebKitScriptWorld* world, WebKitWebPage* webPage, WebKitFrame* frame, WebKitWebExtension* extension) |