1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/exported/WorkerShadowPage.h"
#include "core/exported/WebViewImpl.h"
#include "core/frame/Settings.h"
#include "core/frame/csp/ContentSecurityPolicy.h"
#include "core/loader/FrameLoadRequest.h"
#include "platform/loader/fetch/SubstituteData.h"
#include "public/platform/Platform.h"
#include "public/web/WebSettings.h"
#include "third_party/WebKit/common/page/page_visibility_state.mojom-blink.h"
namespace blink {
WorkerShadowPage::WorkerShadowPage(Client* client)
: client_(client),
web_view_(WebViewImpl::Create(nullptr,
mojom::PageVisibilityState::kVisible,
nullptr)),
main_frame_(WebLocalFrameImpl::CreateMainFrame(web_view_,
this,
nullptr,
nullptr,
g_empty_atom,
WebSandboxFlags::kNone)) {
DCHECK(IsMainThread());
// TODO(http://crbug.com/363843): This needs to find a better way to
// not create graphics layers.
web_view_->GetSettings()->SetAcceleratedCompositingEnabled(false);
// TODO(lunalu): Service worker and shared worker count feature usage on the
// blink side use counter. Once the blink side use counter is removed
// (crbug.com/811948), remove this instant from Settings.
main_frame_->GetFrame()->GetSettings()->SetIsShadowPage(true);
main_frame_->SetDevToolsAgentImpl(
WebDevToolsAgentImpl::CreateForWorker(main_frame_, client_));
}
WorkerShadowPage::~WorkerShadowPage() {
DCHECK(IsMainThread());
// Detach the client before closing the view to avoid getting called back.
main_frame_->SetClient(nullptr);
web_view_->Close();
main_frame_->Close();
}
void WorkerShadowPage::Initialize(const KURL& script_url) {
DCHECK(IsMainThread());
AdvanceState(State::kInitializing);
// Construct substitute data source. We only need it to have same origin as
// the worker so the loading checks work correctly.
CString content("");
scoped_refptr<SharedBuffer> buffer(
SharedBuffer::Create(content.data(), content.length()));
main_frame_->GetFrame()->Loader().Load(FrameLoadRequest(
nullptr, ResourceRequest(script_url), SubstituteData(buffer)));
}
void WorkerShadowPage::SetContentSecurityPolicyAndReferrerPolicy(
ContentSecurityPolicy* content_security_policy,
String referrer_policy) {
DCHECK(IsMainThread());
content_security_policy->SetOverrideURLForSelf(GetDocument()->Url());
GetDocument()->InitContentSecurityPolicy(content_security_policy);
if (!referrer_policy.IsNull())
GetDocument()->ParseAndSetReferrerPolicy(referrer_policy);
}
void WorkerShadowPage::DidFinishDocumentLoad() {
DCHECK(IsMainThread());
AdvanceState(State::kInitialized);
client_->OnShadowPageInitialized();
}
std::unique_ptr<WebApplicationCacheHost>
WorkerShadowPage::CreateApplicationCacheHost(
WebApplicationCacheHostClient* appcache_host_client) {
DCHECK(IsMainThread());
return client_->CreateApplicationCacheHost(appcache_host_client);
}
std::unique_ptr<blink::WebURLLoaderFactory>
WorkerShadowPage::CreateURLLoaderFactory() {
DCHECK(IsMainThread());
return Platform::Current()->CreateDefaultURLLoaderFactory();
}
WebString WorkerShadowPage::GetDevToolsFrameToken() {
// TODO(dgozman): instrumentation token will have to be passed directly to
// DevTools once we stop using a frame for workers. Currently, we rely on
// the frame's instrumentation token to match the worker.
return client_->GetDevToolsFrameToken();
}
bool WorkerShadowPage::WasInitialized() const {
return state_ == State::kInitialized;
}
void WorkerShadowPage::AdvanceState(State new_state) {
switch (new_state) {
case State::kUninitialized:
NOTREACHED();
return;
case State::kInitializing:
DCHECK_EQ(State::kUninitialized, state_);
state_ = new_state;
return;
case State::kInitialized:
DCHECK_EQ(State::kInitializing, state_);
state_ = new_state;
return;
}
}
void WorkerShadowPage::BindDevToolsAgent(
mojom::blink::DevToolsAgentAssociatedRequest request) {
main_frame_->DevToolsAgentImpl()->BindRequest(std::move(request));
}
} // namespace blink
|