summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc
blob: 08633f82e35c4b78b417a11334abbdf4303dfd59 (plain)
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
126
127
128
/*
 * Copyright (C) 2009 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "third_party/blink/renderer/core/workers/shared_worker_client_holder.h"

#include <memory>
#include <utility>
#include "base/logging.h"
#include "services/service_manager/public/cpp/interface_provider.h"
#include "third_party/blink/public/common/messaging/message_port_channel.h"
#include "third_party/blink/public/mojom/worker/shared_worker_info.mojom-blink.h"
#include "third_party/blink/public/platform/web_content_security_policy.h"
#include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/platform/web_url.h"
#include "third_party/blink/public/web/blink.h"
#include "third_party/blink/public/web/web_shared_worker.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
#include "third_party/blink/renderer/core/workers/shared_worker.h"
#include "third_party/blink/renderer/core/workers/shared_worker_client.h"

namespace blink {

const char SharedWorkerClientHolder::kSupplementName[] =
    "SharedWorkerClientHolder";

SharedWorkerClientHolder* SharedWorkerClientHolder::From(Document& document) {
  DCHECK(IsMainThread());
  SharedWorkerClientHolder* holder =
      Supplement<Document>::From<SharedWorkerClientHolder>(document);
  if (!holder) {
    holder = MakeGarbageCollected<SharedWorkerClientHolder>(document);
    Supplement<Document>::ProvideTo(document, holder);
  }
  return holder;
}

SharedWorkerClientHolder::SharedWorkerClientHolder(Document& document)
    : ContextLifecycleObserver(&document),
      task_runner_(document.GetTaskRunner(blink::TaskType::kDOMManipulation)) {
  DCHECK(IsMainThread());
  document.GetInterfaceProvider()->GetInterface(
      mojo::MakeRequest(&connector_, task_runner_));
}

void SharedWorkerClientHolder::Connect(
    SharedWorker* worker,
    MessagePortChannel port,
    const KURL& url,
    mojom::blink::BlobURLTokenPtr blob_url_token,
    const String& name) {
  DCHECK(IsMainThread());
  DCHECK(!name.IsNull());

  // TODO(estark): this is broken, as it only uses the first header
  // when multiple might have been sent. Fix by making the
  // mojom::blink::SharedWorkerInfo take a map that can contain multiple
  // headers.
  Vector<CSPHeaderAndType> headers =
      worker->GetExecutionContext()->GetContentSecurityPolicy()->Headers();
  WebString header = "";
  auto header_type = mojom::ContentSecurityPolicyType::kReport;
  if (headers.size() > 0) {
    header = headers[0].first;
    header_type =
        static_cast<mojom::ContentSecurityPolicyType>(headers[0].second);
  }

  mojom::blink::SharedWorkerInfoPtr info(mojom::blink::SharedWorkerInfo::New(
      url, name, header, header_type,
      worker->GetExecutionContext()->GetSecurityContext().AddressSpace()));

  mojom::blink::SharedWorkerClientPtr client_ptr;
  client_set_.AddBinding(std::make_unique<SharedWorkerClient>(worker),
                         mojo::MakeRequest(&client_ptr, task_runner_),
                         task_runner_);

  connector_->Connect(
      std::move(info), std::move(client_ptr),
      worker->GetExecutionContext()->IsSecureContext()
          ? mojom::SharedWorkerCreationContextType::kSecure
          : mojom::SharedWorkerCreationContextType::kNonsecure,
      port.ReleaseHandle(),
      mojom::blink::BlobURLTokenPtr(mojom::blink::BlobURLTokenPtrInfo(
          blob_url_token.PassInterface().PassHandle(),
          mojom::blink::BlobURLToken::Version_)));
}

void SharedWorkerClientHolder::ContextDestroyed(ExecutionContext*) {
  DCHECK(IsMainThread());
  // Close mojo connections which will signal disinterest in the associated
  // shared worker.
  client_set_.CloseAllBindings();
}

void SharedWorkerClientHolder::Trace(Visitor* visitor) {
  Supplement<Document>::Trace(visitor);
  ContextLifecycleObserver::Trace(visitor);
}

}  // namespace blink