1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CONTENT_RENDERER_SERVICE_WORKER_SERVICE_WORKER_SCRIPT_CONTEXT_H_ 6#define CONTENT_RENDERER_SERVICE_WORKER_SERVICE_WORKER_SCRIPT_CONTEXT_H_ 7 8#include <string> 9#include <vector> 10 11#include "base/basictypes.h" 12#include "base/id_map.h" 13#include "base/memory/scoped_ptr.h" 14#include "base/strings/string16.h" 15#include "content/child/webmessageportchannel_impl.h" 16#include "content/common/service_worker/service_worker_types.h" 17#include "content/renderer/service_worker/service_worker_cache_storage_dispatcher.h" 18#include "third_party/WebKit/public/platform/WebMessagePortChannel.h" 19#include "third_party/WebKit/public/platform/WebServiceWorkerClientsInfo.h" 20#include "third_party/WebKit/public/platform/WebServiceWorkerEventResult.h" 21 22namespace blink { 23class WebServiceWorkerContextProxy; 24} 25 26namespace IPC { 27class Message; 28} 29 30namespace content { 31 32class EmbeddedWorkerContextClient; 33 34// TODO(kinuko): This should implement WebServiceWorkerContextClient 35// rather than having EmbeddedWorkerContextClient implement it. 36// See the header comment in embedded_worker_context_client.h for the 37// potential EW/SW layering concerns. 38class ServiceWorkerScriptContext { 39 public: 40 ServiceWorkerScriptContext( 41 EmbeddedWorkerContextClient* embedded_context, 42 blink::WebServiceWorkerContextProxy* proxy); 43 ~ServiceWorkerScriptContext(); 44 45 void OnMessageReceived(const IPC::Message& message); 46 47 void DidHandleActivateEvent(int request_id, 48 blink::WebServiceWorkerEventResult); 49 void DidHandleInstallEvent(int request_id, 50 blink::WebServiceWorkerEventResult result); 51 void DidHandleFetchEvent(int request_id, 52 ServiceWorkerFetchEventResult result, 53 const ServiceWorkerResponse& response); 54 void DidHandleSyncEvent(int request_id); 55 void GetClientDocuments( 56 blink::WebServiceWorkerClientsCallbacks* callbacks); 57 void PostMessageToDocument( 58 int client_id, 59 const base::string16& message, 60 scoped_ptr<blink::WebMessagePortChannelArray> channels); 61 62 // Send a message to the browser. Takes ownership of |message|. 63 void Send(IPC::Message* message); 64 65 // Get routing_id for sending message to the ServiceWorkerVersion 66 // in the browser process. 67 int GetRoutingID() const; 68 69 blink::WebServiceWorkerCacheStorage* cache_storage() { 70 return cache_storage_dispatcher_.get(); 71 } 72 73 private: 74 typedef IDMap<blink::WebServiceWorkerClientsCallbacks, IDMapOwnPointer> 75 ClientsCallbacksMap; 76 77 78 void OnActivateEvent(int request_id); 79 void OnInstallEvent(int request_id, int active_version_id); 80 void OnFetchEvent(int request_id, const ServiceWorkerFetchRequest& request); 81 void OnSyncEvent(int request_id); 82 void OnPushEvent(int request_id, const std::string& data); 83 void OnPostMessage(const base::string16& message, 84 const std::vector<int>& sent_message_port_ids, 85 const std::vector<int>& new_routing_ids); 86 void OnDidGetClientDocuments( 87 int request_id, const std::vector<int>& client_ids); 88 89 scoped_ptr<ServiceWorkerCacheStorageDispatcher> cache_storage_dispatcher_; 90 91 // Not owned; embedded_context_ owns this. 92 EmbeddedWorkerContextClient* embedded_context_; 93 94 // Not owned; this object is destroyed when proxy_ becomes invalid. 95 blink::WebServiceWorkerContextProxy* proxy_; 96 97 // Used for incoming messages from the browser for which an outgoing response 98 // back to the browser is expected, the id must be sent back with the 99 // response. 100 int current_request_id_; 101 102 // Pending callbacks for GetClientDocuments(). 103 ClientsCallbacksMap pending_clients_callbacks_; 104 105 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerScriptContext); 106}; 107 108} // namespace content 109 110#endif // CONTENT_RENDERER_SERVICE_WORKER_SERVICE_WORKER_SCRIPT_CONTEXT_H_ 111