Fix various typos, error handling for GN auto-roller.
[chromium-blink-merge.git] / content / child / permissions / permission_dispatcher.h
blobe0a61a6ec824b90cdb76203650a32036016833e2
1 // Copyright 2015 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.
5 #ifndef CONTENT_CHILD_PERMISSIONS_PERMISSION_DISPATCHER_H_
6 #define CONTENT_CHILD_PERMISSIONS_PERMISSION_DISPATCHER_H_
8 #include <string>
10 #include "base/callback_forward.h"
11 #include "base/id_map.h"
12 #include "base/macros.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "content/child/permissions/permission_observers_registry.h"
15 #include "content/common/permission_service.mojom.h"
16 #include "third_party/WebKit/public/platform/modules/permissions/WebPermissionClient.h"
18 namespace content {
20 class ServiceRegistry;
22 // The PermissionDispatcher is a layer between Blink and the Mojo
23 // PermissionService. It implements blink::WebPermissionClient. It is being used
24 // from workers and frames independently. When called outside of the main
25 // thread, QueryPermissionForWorker is meant to be called. It will handle the
26 // thread jumping.
27 class PermissionDispatcher : public blink::WebPermissionClient,
28 public PermissionObserversRegistry {
29 public:
30 // Returns whether the given WebPermissionType is observable. Some types have
31 // static values that never changes.
32 static bool IsObservable(blink::WebPermissionType type);
34 // The caller must guarantee that |service_registry| will have a lifetime
35 // larger than this instance of PermissionDispatcher.
36 explicit PermissionDispatcher(ServiceRegistry* service_registry);
37 virtual ~PermissionDispatcher();
39 // blink::WebPermissionClient implementation.
40 virtual void queryPermission(blink::WebPermissionType type,
41 const blink::WebURL& origin,
42 blink::WebPermissionCallback* callback);
43 virtual void revokePermission(blink::WebPermissionType,
44 const blink::WebURL& origin,
45 blink::WebPermissionCallback* callback);
46 virtual void startListening(blink::WebPermissionType type,
47 const blink::WebURL& origin,
48 blink::WebPermissionObserver* observer);
49 virtual void stopListening(blink::WebPermissionObserver* observer);
51 // The following methods must be called by workers on the main thread.
52 void QueryPermissionForWorker(blink::WebPermissionType type,
53 const std::string& origin,
54 blink::WebPermissionCallback* callback,
55 int worker_thread_id);
56 void RevokePermissionForWorker(blink::WebPermissionType type,
57 const std::string& origin,
58 blink::WebPermissionCallback* callback,
59 int worker_thread_id);
60 void StartListeningForWorker(
61 blink::WebPermissionType type,
62 const std::string& origin,
63 int worker_thread_id,
64 const base::Callback<void(blink::WebPermissionStatus)>& callback);
65 void GetNextPermissionChangeForWorker(
66 blink::WebPermissionType type,
67 const std::string& origin,
68 blink::WebPermissionStatus status,
69 int worker_thread_id,
70 const base::Callback<void(blink::WebPermissionStatus)>& callback);
72 private:
73 // Runs the given |callback| with |status| as a parameter. It has to be run
74 // on a worker thread.
75 static void RunCallbackOnWorkerThread(
76 blink::WebPermissionCallback* callback,
77 scoped_ptr<blink::WebPermissionStatus> status);
79 // Helper method that returns an initialized PermissionServicePtr.
80 PermissionServicePtr& GetPermissionServicePtr();
82 void QueryPermissionInternal(blink::WebPermissionType type,
83 const std::string& origin,
84 blink::WebPermissionCallback* callback,
85 int worker_thread_id);
86 void RevokePermissionInternal(blink::WebPermissionType type,
87 const std::string& origin,
88 blink::WebPermissionCallback* callback,
89 int worker_thread_id);
91 // This is the callback function used for query and revoke
92 void OnPermissionResponse(int request_id,
93 PermissionStatus status);
94 void OnPermissionChanged(blink::WebPermissionType type,
95 const std::string& origin,
96 blink::WebPermissionObserver* observer,
97 PermissionStatus status);
98 void OnPermissionChangedForWorker(
99 int worker_thread_id,
100 const base::Callback<void(blink::WebPermissionStatus)>& callback,
101 PermissionStatus status);
103 void GetNextPermissionChange(blink::WebPermissionType type,
104 const std::string& origin,
105 blink::WebPermissionObserver* observer,
106 PermissionStatus current_status);
108 // Saves some basic information about the callback in order to be able to run
109 // it in the right thread.
110 class CallbackInformation {
111 public:
112 CallbackInformation(blink::WebPermissionCallback* callback,
113 int worker_thread_id);
114 ~CallbackInformation();
116 blink::WebPermissionCallback* callback() const;
117 int worker_thread_id() const;
119 blink::WebPermissionCallback* ReleaseCallback();
121 private:
122 scoped_ptr<blink::WebPermissionCallback> callback_;
123 int worker_thread_id_;
125 DISALLOW_COPY_AND_ASSIGN(CallbackInformation);
127 using CallbackMap = IDMap<CallbackInformation, IDMapOwnPointer>;
128 CallbackMap pending_callbacks_;
130 ServiceRegistry* service_registry_;
131 PermissionServicePtr permission_service_;
133 DISALLOW_COPY_AND_ASSIGN(PermissionDispatcher);
136 } // namespace content
138 #endif // CONTENT_CHILD_PERMISSIONS_PERMISSION_DISPATCHER_H_