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

Unified Diff: Source/core/workers/WorkerThread.cpp

Issue 592183002: [WIP]Implement Blink side changes for navigator.language(s) support for workers. Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Dedicated worker languagechange event added. Still WIP. Created 6 years, 2 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
« no previous file with comments | « Source/core/workers/WorkerThread.h ('k') | Source/web/WebSharedWorkerImpl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/workers/WorkerThread.cpp
diff --git a/Source/core/workers/WorkerThread.cpp b/Source/core/workers/WorkerThread.cpp
index 166679e448d1e49897a71187389409c8dec51f31..d93ead1582f5f5546d4caa41b72bf40ff0ce8fed 100644
--- a/Source/core/workers/WorkerThread.cpp
+++ b/Source/core/workers/WorkerThread.cpp
@@ -34,6 +34,8 @@
#include "core/inspector/WorkerInspectorController.h"
#include "core/workers/DedicatedWorkerGlobalScope.h"
#include "core/workers/WorkerClients.h"
+#include "core/workers/WorkerGlobalScope.h"
+#include "core/workers/WorkerLanguageTasks.h"
#include "core/workers/WorkerReportingProxy.h"
#include "core/workers/WorkerThreadStartupData.h"
#include "platform/PlatformThreadData.h"
@@ -225,7 +227,7 @@ void WorkerThread::start()
if (m_thread)
return;
- m_thread = WebThreadSupportingGC::create("WebCore: Worker");
+ m_thread = adoptPtr(blink::Platform::current()->createThread("WebCore: Worker"));
m_thread->postTask(new Task(WTF::bind(&WorkerThread::initialize, this)));
}
@@ -240,7 +242,7 @@ PlatformThreadId WorkerThread::platformThreadId() const
{
if (!m_thread)
return 0;
- return m_thread->platformThread().threadId();
+ return m_thread->threadId();
}
void WorkerThread::initialize()
@@ -262,7 +264,11 @@ void WorkerThread::initialize()
m_microtaskRunner = adoptPtr(new MicrotaskRunner);
m_thread->addTaskObserver(m_microtaskRunner.get());
- m_thread->attachGC();
+ m_pendingGCRunner = adoptPtr(new PendingGCRunner);
+ m_messageLoopInterruptor = adoptPtr(new MessageLoopInterruptor(m_thread.get()));
+ m_thread->addTaskObserver(m_pendingGCRunner.get());
+ ThreadState::attach();
+ ThreadState::current()->addInterruptor(m_messageLoopInterruptor.get());
m_workerGlobalScope = createWorkerGlobalScope(m_startupData.release());
m_sharedTimer = adoptPtr(new WorkerSharedTimer(this));
@@ -302,10 +308,23 @@ void WorkerThread::cleanup()
m_workerGlobalScope->dispose();
m_workerGlobalScope = nullptr;
- m_thread->detachGC();
+ ThreadState::current()->removeInterruptor(m_messageLoopInterruptor.get());
+
+ // Detach the ThreadState, cleaning out the thread's heap by
+ // performing a final GC. The cleanup operation will at the end
+ // assert that the heap is empty. If the heap does not become
+ // empty, there are still pointers into the heap and those
+ // pointers will be dangling after thread termination because we
+ // are destroying the heap. It is important to detach while the
+ // thread is still valid. In particular, finalizers for objects in
+ // the heap for this thread will need to access thread local data.
+ ThreadState::detach();
m_thread->removeTaskObserver(m_microtaskRunner.get());
m_microtaskRunner = nullptr;
+ m_thread->removeTaskObserver(m_pendingGCRunner.get());
+ m_pendingGCRunner = nullptr;
+ m_messageLoopInterruptor = nullptr;
// Notify the proxy that the WorkerGlobalScope has been disposed of.
// This can free this thread object, hence it must not be touched afterwards.
@@ -485,4 +504,38 @@ void WorkerThread::setWorkerInspectorController(WorkerInspectorController* worke
m_workerInspectorController = workerInspectorController;
}
+void WorkerThread::postTaskLanguageChanged()
+{
+ postTask(WorkerThreadAcceptLanguagesChangedTask::create());
+}
+
+void WorkerThread::notifyAcceptLanguagesChanged(const Vector<String>& newLanguagesList)
+{
+ MutexLocker lock(threadSetMutex());
+ HashSet<WorkerThread*> threads = workerThreads();
+
+ for (HashSet<WorkerThread*>::iterator itr = threads.begin(); itr != threads.end(); ++itr) {
+ // Set the new languages list
+ (*itr)->postTask(WorkerThreadSetUserPreferredLanguagesTask::create(newLanguagesList));
+ // Mark the langs have changed and queue up an event
+ (*itr)->postTask(WorkerThreadAcceptLanguagesChangedTask::create());
+ }
+}
+
+// void WorkerThread::notifyAcceptLanguagesChanged(const String& newLanguagesList)
+// {
+// MutexLocker lock(threadSetMutex());
+// HashSet<WorkerThread*> threads = workerThreads();
+// Vector<String> languages;
+// String acceptLanguages = m_frame->host()->chrome().client().acceptLanguages();
+// acceptLanguages.split(',', languages);
+
+// for (HashSet<WorkerThread*>::iterator itr = threads.begin(); itr != threads.end(); ++itr) {
+// // Set the new languages list
+// (*itr)->postTask(WorkerThreadSetUserPreferredLanguagesTask::create(languages));
+// // Mark the langs have changed and queue up an event
+// (*itr)->postTask(WorkerThreadAcceptLanguagesChangedTask::create());
+// }
+// }
+
} // namespace blink
« no previous file with comments | « Source/core/workers/WorkerThread.h ('k') | Source/web/WebSharedWorkerImpl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698