1a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// found in the LICENSE file.
4a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/child/service_worker/web_service_worker_impl.h"
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/child/service_worker/service_worker_dispatcher.h"
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/child/service_worker/service_worker_handle_reference.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/child/thread_safe_sender.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/child/webmessageportchannel_impl.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/common/service_worker/service_worker_messages.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "third_party/WebKit/public/platform/WebServiceWorkerProxy.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "third_party/WebKit/public/platform/WebString.h"
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing blink::WebMessagePortChannel;
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing blink::WebMessagePortChannelArray;
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing blink::WebMessagePortChannelClient;
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing blink::WebString;
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace content {
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochWebServiceWorkerImpl::WebServiceWorkerImpl(
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_ptr<ServiceWorkerHandleReference> handle_ref,
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ThreadSafeSender* thread_safe_sender)
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : handle_ref_(handle_ref.Pass()),
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      state_(handle_ref_->state()),
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      thread_safe_sender_(thread_safe_sender),
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      proxy_(NULL) {
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ServiceWorkerDispatcher* dispatcher =
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ServiceWorkerDispatcher::GetThreadSpecificInstance();
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(dispatcher);
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  dispatcher->AddServiceWorker(handle_ref_->handle_id(), this);
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochWebServiceWorkerImpl::~WebServiceWorkerImpl() {
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (handle_ref_->handle_id() == kInvalidServiceWorkerHandleId)
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return;
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ServiceWorkerDispatcher* dispatcher =
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ServiceWorkerDispatcher::GetThreadSpecificInstance();
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (dispatcher)
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    dispatcher->RemoveServiceWorker(handle_ref_->handle_id());
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid WebServiceWorkerImpl::OnStateChanged(
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    blink::WebServiceWorkerState new_state) {
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(proxy_);
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (proxy_->isReady())
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ChangeState(new_state);
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  else
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    queued_states_.push_back(new_state);
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid WebServiceWorkerImpl::setProxy(blink::WebServiceWorkerProxy* proxy) {
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  proxy_ = proxy;
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)blink::WebServiceWorkerProxy* WebServiceWorkerImpl::proxy() {
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return proxy_;
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid WebServiceWorkerImpl::proxyReadyChanged() {
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!proxy_->isReady())
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (std::vector<blink::WebServiceWorkerState>::iterator it =
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu           queued_states_.begin();
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu       it != queued_states_.end();
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu       ++it) {
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ChangeState(*it);
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  queued_states_.clear();
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochblink::WebURL WebServiceWorkerImpl::scope() const {
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return handle_ref_->scope();
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochblink::WebURL WebServiceWorkerImpl::url() const {
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return handle_ref_->url();
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochblink::WebServiceWorkerState WebServiceWorkerImpl::state() const {
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return state_;
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WebServiceWorkerImpl::postMessage(const WebString& message,
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       WebMessagePortChannelArray* channels) {
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  thread_safe_sender_->Send(new ServiceWorkerHostMsg_PostMessageToWorker(
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      handle_ref_->handle_id(),
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      message,
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      WebMessagePortChannelImpl::ExtractMessagePortIDs(channels)));
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid WebServiceWorkerImpl::ChangeState(blink::WebServiceWorkerState new_state) {
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(proxy_);
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(proxy_->isReady());
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  state_ = new_state;
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  proxy_->dispatchStateChangeEvent();
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace content
101