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