service_worker_dispatcher.h revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
1// Copyright 2013 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_CHILD_SERVICE_WORKER_SERVICE_WORKER_DISPATCHER_H_
6#define CONTENT_CHILD_SERVICE_WORKER_SERVICE_WORKER_DISPATCHER_H_
7
8#include <map>
9
10#include "base/id_map.h"
11#include "base/memory/ref_counted.h"
12#include "base/strings/string16.h"
13#include "content/child/worker_task_runner.h"
14#include "third_party/WebKit/public/platform/WebServiceWorkerError.h"
15#include "third_party/WebKit/public/platform/WebServiceWorkerProvider.h"
16
17class GURL;
18
19namespace blink {
20class WebURL;
21}
22
23namespace IPC {
24class Message;
25}
26
27namespace content {
28class ServiceWorkerMessageFilter;
29class ThreadSafeSender;
30class WebServiceWorkerImpl;
31
32// This class manages communication with the browser process about
33// registration of the service worker, exposed to renderer and worker
34// scripts through methods like navigator.registerServiceWorker().
35class ServiceWorkerDispatcher : public WorkerTaskRunner::Observer {
36 public:
37  explicit ServiceWorkerDispatcher(ThreadSafeSender* thread_safe_sender);
38  virtual ~ServiceWorkerDispatcher();
39
40  void OnMessageReceived(const IPC::Message& msg);
41  bool Send(IPC::Message* msg);
42
43  // Corresponds to navigator.serviceWorker.register()
44  void RegisterServiceWorker(
45      const GURL& pattern,
46      const GURL& script_url,
47      blink::WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks);
48  // Corresponds to navigator.serviceWorker.unregister()
49  void UnregisterServiceWorker(
50      const GURL& pattern,
51      blink::WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks);
52
53  // Called when navigator.serviceWorker is instantiated or detached
54  // for a document whose provider can be identified by |provider_id|.
55  void AddScriptClient(int provider_id,
56                       blink::WebServiceWorkerProviderClient* client);
57  void RemoveScriptClient(int provider_id);
58
59  // |thread_safe_sender| needs to be passed in because if the call leads to
60  // construction it will be needed.
61  static ServiceWorkerDispatcher* ThreadSpecificInstance(
62      ThreadSafeSender* thread_safe_sender);
63
64 private:
65  typedef std::map<int, blink::WebServiceWorkerProviderClient*> ScriptClientMap;
66
67  // WorkerTaskRunner::Observer implementation.
68  virtual void OnWorkerRunLoopStopped() OVERRIDE;
69
70  // The asynchronous success response to RegisterServiceWorker.
71  void OnRegistered(int32 thread_id,
72                    int32 request_id,
73                    int handle_id);
74  // The asynchronous success response to UregisterServiceWorker.
75  void OnUnregistered(int32 thread_id,
76                      int32 request_id);
77  void OnRegistrationError(int32 thread_id,
78                           int32 request_id,
79                           blink::WebServiceWorkerError::ErrorType error_type,
80                           const base::string16& message);
81
82  IDMap<blink::WebServiceWorkerProvider::WebServiceWorkerCallbacks,
83        IDMapOwnPointer> pending_callbacks_;
84  ScriptClientMap script_clients_;
85
86  scoped_refptr<ThreadSafeSender> thread_safe_sender_;
87
88  DISALLOW_COPY_AND_ASSIGN(ServiceWorkerDispatcher);
89};
90
91}  // namespace content
92
93#endif  // CONTENT_CHILD_SERVICE_WORKER_SERVICE_WORKER_DISPATCHER_H_
94