Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(813)

Unified Diff: third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThreadTest.cpp

Issue 2332963003: Unset CompositorWorkerGlobalScope during WorkerGlobalScope::dipose. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThreadTest.cpp
diff --git a/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThreadTest.cpp b/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThreadTest.cpp
index 9220ccc44d39e2dbd92972069dd7b515e88551e9..3c06a9b90afa9a61339b87635f37434c1d988b86 100644
--- a/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThreadTest.cpp
+++ b/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThreadTest.cpp
@@ -16,6 +16,7 @@
#include "core/workers/WorkerLoaderProxy.h"
#include "core/workers/WorkerOrWorkletGlobalScope.h"
#include "core/workers/WorkerThreadStartupData.h"
+#include "modules/compositorworker/CompositorWorkerGlobalScope.h"
#include "platform/CrossThreadFunctional.h"
#include "platform/WaitableEvent.h"
#include "platform/WebThreadSupportingGC.h"
@@ -68,11 +69,23 @@ class TestCompositorProxyClient
USING_GARBAGE_COLLECTED_MIXIN(TestCompositorProxyClient);
public:
TestCompositorProxyClient() {}
+ DEFINE_INLINE_VIRTUAL_TRACE()
+ {
+ CompositorProxyClient::trace(visitor);
+ visitor->trace(m_globalScope);
+ }
- void setGlobalScope(WorkerGlobalScope*) override {}
+ void setGlobalScope(WorkerGlobalScope* scope) override
+ {
+ m_globalScope = static_cast<CompositorWorkerGlobalScope*>(scope);
+ }
+ CompositorWorkerGlobalScope* globalScope() { return m_globalScope; }
void requestAnimationFrame() override {}
void registerCompositorProxy(CompositorProxy*) override {}
void unregisterCompositorProxy(CompositorProxy*) override {}
+
+private:
+ Member<CompositorWorkerGlobalScope> m_globalScope;
};
class CompositorWorkerTestPlatform : public TestingPlatformSupport {
@@ -112,11 +125,13 @@ public:
CompositorWorkerThread::clearSharedBackingThread();
}
- std::unique_ptr<CompositorWorkerThread> createCompositorWorker()
+ std::unique_ptr<CompositorWorkerThread> createCompositorWorker(CompositorProxyClient* client = nullptr)
{
std::unique_ptr<CompositorWorkerThread> workerThread = CompositorWorkerThread::create(nullptr, *m_objectProxy, 0);
WorkerClients* clients = WorkerClients::create();
- provideCompositorProxyClientTo(clients, new TestCompositorProxyClient);
+ if (!client)
+ client = new TestCompositorProxyClient();
+ provideCompositorProxyClientTo(clients, client);
workerThread->start(WorkerThreadStartupData::create(
KURL(ParsedURLString, "http://fake.url/"),
"fake user agent",
@@ -143,6 +158,14 @@ public:
waitEvent->wait();
}
+ void waitForWorker(WorkerThread* worker)
+ {
+ std::unique_ptr<WaitableEvent> waitEvent = wrapUnique(new WaitableEvent());
+ worker->workerBackingThread().backingThread().postTask(BLINK_FROM_HERE, crossThreadBind(&CompositorWorkerThreadTest::signalFromWorker, crossThreadUnretained(this),
+ crossThreadUnretained(worker), crossThreadUnretained(waitEvent.get())));
+ waitEvent->wait();
+ }
+
private:
void executeScriptInWorker(WorkerThread* worker, WaitableEvent* waitEvent)
{
@@ -152,6 +175,11 @@ private:
waitEvent->signal();
}
+ void signalFromWorker(WorkerThread* worker, WaitableEvent* waitEvent)
+ {
+ waitEvent->signal();
+ }
+
std::unique_ptr<DummyPageHolder> m_page;
RefPtr<SecurityOrigin> m_securityOrigin;
std::unique_ptr<InProcessWorkerObjectProxy> m_objectProxy;
@@ -165,6 +193,21 @@ TEST_F(CompositorWorkerThreadTest, Basic)
compositorWorker->terminateAndWait();
}
+TEST_F(CompositorWorkerThreadTest, Shutdown)
+{
+ TestCompositorProxyClient* testClient = new TestCompositorProxyClient;
+ std::unique_ptr<CompositorWorkerThread> compositorWorker = createCompositorWorker(testClient);
+ waitForWorker(compositorWorker.get());
+ // Once the worker has started, we should have a valid global scope.
+ EXPECT_NE(nullptr, testClient->globalScope());
+
+ // After terminating the worker, we should no longer have a reference to the global scope
+ // in the client so that we don't try to execute animation frame callbacks on a terminated
+ // worker.
+ compositorWorker->terminateAndWait();
+ EXPECT_EQ(nullptr, testClient->globalScope());
+}
+
// Tests that the same WebThread is used for new workers if the WebThread is still alive.
TEST_F(CompositorWorkerThreadTest, CreateSecondAndTerminateFirst)
{

Powered by Google App Engine
This is Rietveld 408576698