| OLD | NEW |
| (Empty) | |
| 1 |
| 2 #include "web/WebIsolatedWorkerImpl.h" |
| 3 |
| 4 #include "base/debug/stack_trace.h" |
| 5 #include "base/logging.h" |
| 6 #include "bindings/core/v8/ScriptSourceCode.h" |
| 7 #include "core/fetch/CachedMetadata.h" |
| 8 #include "core/inspector/ConsoleMessage.h" |
| 9 #include "core/workers/WorkerBackingThread.h" |
| 10 #include "core/workers/WorkerReportingProxy.h" |
| 11 #include "core/workers/WorkerThread.h" |
| 12 #include "core/workers/WorkerThreadStartupData.h" |
| 13 #include "modules/EventTargetModulesNames.h" |
| 14 #include "modules/fetch/Request.h" |
| 15 #include "modules/serviceworkers/FetchEvent.h" |
| 16 #include "modules/serviceworkers/FetchEventInit.h" |
| 17 #include "modules/serviceworkers/IsolatedWorkerReportingProxy.h" |
| 18 #include "modules/serviceworkers/IsolatedWorkerThread.h" |
| 19 #include "modules/serviceworkers/RespondWithObserver.h" |
| 20 #include "mojo/public/cpp/bindings/binding.h" |
| 21 #include "platform/TraceEvent.h" |
| 22 #include "platform/WebThreadSupportingGC.h" |
| 23 #include "public/platform/modules/serviceworker/service_worker.mojom-blink.h" |
| 24 #include "public/platform/modules/serviceworker/WebServiceWorkerRequest.h" |
| 25 #include "public/platform/Platform.h" |
| 26 #include "public/platform/WebThread.h" |
| 27 #include "public/web/modules/serviceworker/WebIsolatedWorkerContextClient.h" |
| 28 #include "public/web/WebSettings.h" |
| 29 #include "public/web/WebView.h" |
| 30 #include "web/WebLocalFrameImpl.h" |
| 31 #include "wtf/PtrUtil.h" |
| 32 #include "wtf/Threading.h" |
| 33 |
| 34 namespace blink { |
| 35 |
| 36 WebIsolatedWorkerImpl::MainThreadProxy::MainThreadProxy(WebIsolatedWorkerImpl* w
orker, KURL scopeURL) |
| 37 : m_worker(worker) |
| 38 , m_scopeURL(scopeURL) |
| 39 { |
| 40 // Created in IO thread |
| 41 } |
| 42 |
| 43 WebIsolatedWorkerImpl::MainThreadProxy::~MainThreadProxy() |
| 44 { |
| 45 // TODO: Must be deleted in Main thread |
| 46 DCHECK(!m_worker); |
| 47 } |
| 48 |
| 49 void WebIsolatedWorkerImpl::MainThreadProxy::detach() |
| 50 { |
| 51 MutexLocker locker(m_lock_for_worker); |
| 52 m_worker = nullptr; |
| 53 } |
| 54 |
| 55 void WebIsolatedWorkerImpl::MainThreadProxy::initializeOnMainThread(KURL scopeUR
L) |
| 56 { |
| 57 // Called in Main thread. |
| 58 TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::MainThreadProxy::initi
alizeOnMainThread"); |
| 59 LOG(ERROR) << "WebIsolatedWorkerImpl::MainThreadProxy::initializeOnMainThrea
d~=|~~~~~~~~~~~~~~~~~~"; |
| 60 CHECK(isMainThread()); |
| 61 |
| 62 WebView* webView = WebView::create(nullptr, WebPageVisibilityStateVisible); |
| 63 WebSettings* settings = webView->settings(); |
| 64 settings->setAcceleratedCompositingEnabled(false); |
| 65 settings->setStrictMixedContentChecking(true); |
| 66 settings->setAllowDisplayOfInsecureContent(false); |
| 67 settings->setAllowRunningOfInsecureContent(false); |
| 68 settings->setDataSaverEnabled(false); |
| 69 WebLocalFrameImpl* mainFrame = toWebLocalFrameImpl(WebLocalFrame::create(Web
TreeScopeType::Document, this)); |
| 70 webView->setMainFrame(mainFrame); |
| 71 { |
| 72 TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::MainThreadProxy::i
nitializeOnMainThread lock"); |
| 73 MutexLocker locker(m_lock_for_document); |
| 74 m_webView = webView; |
| 75 m_mainFrame = mainFrame; |
| 76 CString content(""); |
| 77 RefPtr<SharedBuffer> buffer(SharedBuffer::create(content.data(), content
.length())); |
| 78 m_mainFrame->frame()->loader().load(FrameLoadRequest(0, ResourceRequest(
scopeURL), SubstituteData(buffer, "text/html", "UTF-8", KURL()))); |
| 79 |
| 80 // TODO: initialize shadow page |
| 81 } |
| 82 } |
| 83 |
| 84 void WebIsolatedWorkerImpl::MainThreadProxy::postTaskToLoader(const WebTraceLoca
tion& location, std::unique_ptr<ExecutionContextTask> task) |
| 85 { |
| 86 TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::MainThreadProxy::postT
askToLoader"); |
| 87 MutexLocker locker(m_lock_for_document); |
| 88 LOG(ERROR) << "WebIsolatedWorkerImpl::MainThreadProxy::postTaskToLoader"; |
| 89 if (!m_shadowPageLoadStarted) { |
| 90 m_shadowPageLoadStarted = true; |
| 91 Platform::current()->mainThread()->getWebTaskRunner()->postTask( |
| 92 BLINK_FROM_HERE, |
| 93 crossThreadBind( |
| 94 &MainThreadProxy::initializeOnMainThread, |
| 95 wrapPassRefPtr(this), m_scopeURL)); |
| 96 m_pending_tasks.push_back(std::move(task)); |
| 97 return; |
| 98 } |
| 99 |
| 100 // Keep tasks if the shadow page is not created yet. |
| 101 if (m_shadowPageLoaded) |
| 102 m_mainFrame->frame()->document()->postTask(location, std::move(task)); |
| 103 else |
| 104 m_pending_tasks.push_back(std::move(task)); |
| 105 } |
| 106 |
| 107 void WebIsolatedWorkerImpl::MainThreadProxy::postTaskToWorkerGlobalScope(const W
ebTraceLocation& location, std::unique_ptr<ExecutionContextTask> task) |
| 108 { |
| 109 TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::MainThreadProxy::postT
askToWorkerGlobalScope"); |
| 110 LOG(ERROR) << "WebIsolatedWorkerImpl::postTaskToWorkerGlobalScope"; |
| 111 MutexLocker locker(m_lock_for_worker); |
| 112 |
| 113 m_worker->thread()->postTask(location, std::move(task)); |
| 114 } |
| 115 |
| 116 void WebIsolatedWorkerImpl::MainThreadProxy::willSendRequest(WebLocalFrame*, Web
URLRequest& request) |
| 117 { |
| 118 TRACE_EVENT1("ServiceWorker", "WebIsolatedWorkerImpl::MainThreadProxy::willS
endRequest", |
| 119 "URL", request.url().string().utf8().data()); |
| 120 LOG(ERROR) << "WebIsolatedWorkerImpl::MainThreadProxy::willSendRequest "; |
| 121 // TODO: set provider host id |
| 122 } |
| 123 |
| 124 void WebIsolatedWorkerImpl::MainThreadProxy::didFinishDocumentLoad(WebLocalFrame
*) |
| 125 { |
| 126 TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::MainThreadProxy::didFi
nishDocumentLoad"); |
| 127 LOG(ERROR) << "WebIsolatedWorkerImpl::MainThreadProxy::didFinishDocumentLoad
"; |
| 128 MutexLocker locker(m_lock_for_document); |
| 129 m_shadowPageLoaded = true; |
| 130 for (auto& task : m_pending_tasks) |
| 131 m_mainFrame->frame()->document()->postTask(BLINK_FROM_HERE, std::move(ta
sk)); |
| 132 m_pending_tasks.clear(); |
| 133 } |
| 134 |
| 135 WebIsolatedWorker* WebIsolatedWorker::create(WebIsolatedWorkerContextClient* cli
ent) |
| 136 { |
| 137 // Called in IO thread. |
| 138 return new WebIsolatedWorkerImpl(wrapUnique(client)); |
| 139 } |
| 140 |
| 141 WebIsolatedWorkerImpl::WebIsolatedWorkerImpl(std::unique_ptr<WebIsolatedWorkerCo
ntextClient> client) |
| 142 : m_workerGlobalScopeProxy(IsolatedWorkerReportingProxy::create(std::move(cl
ient))) |
| 143 { |
| 144 // Called in IO thread. |
| 145 TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::WebIsolatedWorkerImpl"
); |
| 146 } |
| 147 |
| 148 WebIsolatedWorkerImpl::~WebIsolatedWorkerImpl() |
| 149 { |
| 150 // Called in IO thread. |
| 151 TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::~WebIsolatedWorkerImpl
"); |
| 152 } |
| 153 |
| 154 void WebIsolatedWorkerImpl::startWorker(int64_t versionID, WebURL scopeURL, WebU
RL scriptURL) |
| 155 { |
| 156 // Called in IO thread. |
| 157 TRACE_EVENT0("ServiceWorker", "WebIsolatedWorkerImpl::startWorker"); |
| 158 m_mainThreadProxy = new MainThreadProxy(this, scopeURL); |
| 159 m_loaderProxy = WorkerLoaderProxy::create(m_mainThreadProxy.get()); |
| 160 m_workerThread = IsolatedWorkerThread::create(m_loaderProxy, *m_workerGlobal
ScopeProxy); |
| 161 m_workerGlobalScopeProxy->setVersionID(versionID); |
| 162 m_workerGlobalScopeProxy->setThread(m_workerThread.get()); |
| 163 m_workerThread->start(WorkerThreadStartupData::create( |
| 164 scriptURL, |
| 165 "fake user agent", |
| 166 "console.log('test1');importScripts(\"importScripts.js\");console.log('t
est2');", |
| 167 nullptr, |
| 168 DontPauseWorkerGlobalScopeOnStart, |
| 169 nullptr, |
| 170 "", |
| 171 nullptr, |
| 172 nullptr, |
| 173 WebAddressSpaceLocal, |
| 174 nullptr, |
| 175 nullptr, |
| 176 V8CacheOptionsDefault)); |
| 177 } |
| 178 |
| 179 } // namespace blink |
| OLD | NEW |