OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef EXTENSIONS_BROWSER_EXTENSION_FUNCTION_DISPATCHER_H_ | 5 #ifndef EXTENSIONS_BROWSER_EXTENSION_FUNCTION_DISPATCHER_H_ |
6 #define EXTENSIONS_BROWSER_EXTENSION_FUNCTION_DISPATCHER_H_ | 6 #define EXTENSIONS_BROWSER_EXTENSION_FUNCTION_DISPATCHER_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
89 // - This object outlives any RenderFrameHost's passed to created | 89 // - This object outlives any RenderFrameHost's passed to created |
90 // ExtensionFunctions. | 90 // ExtensionFunctions. |
91 explicit ExtensionFunctionDispatcher( | 91 explicit ExtensionFunctionDispatcher( |
92 content::BrowserContext* browser_context); | 92 content::BrowserContext* browser_context); |
93 ~ExtensionFunctionDispatcher(); | 93 ~ExtensionFunctionDispatcher(); |
94 | 94 |
95 // Message handlers. | 95 // Message handlers. |
96 // The response is sent to the corresponding render view in an | 96 // The response is sent to the corresponding render view in an |
97 // ExtensionMsg_Response message. | 97 // ExtensionMsg_Response message. |
98 void Dispatch(const ExtensionHostMsg_Request_Params& params, | 98 void Dispatch(const ExtensionHostMsg_Request_Params& params, |
99 content::RenderFrameHost* render_frame_host); | 99 content::RenderFrameHost* render_frame_host, |
100 int render_process_id); | |
100 | 101 |
101 // Called when an ExtensionFunction is done executing, after it has sent | 102 // Called when an ExtensionFunction is done executing, after it has sent |
102 // a response (if any) to the extension. | 103 // a response (if any) to the extension. |
103 void OnExtensionFunctionCompleted(const Extension* extension); | 104 void OnExtensionFunctionCompleted(const Extension* extension); |
104 | 105 |
105 // See the Delegate class for documentation on these methods. | 106 // See the Delegate class for documentation on these methods. |
106 // TODO(devlin): None of these belong here. We should kill | 107 // TODO(devlin): None of these belong here. We should kill |
107 // ExtensionFunctionDispatcher::Delegate. | 108 // ExtensionFunctionDispatcher::Delegate. |
108 WindowController* GetExtensionWindowController() const; | 109 WindowController* GetExtensionWindowController() const; |
109 content::WebContents* GetAssociatedWebContents() const; | 110 content::WebContents* GetAssociatedWebContents() const; |
110 content::WebContents* GetVisibleWebContents() const; | 111 content::WebContents* GetVisibleWebContents() const; |
111 | 112 |
112 // The BrowserContext that this dispatcher is associated with. | 113 // The BrowserContext that this dispatcher is associated with. |
113 content::BrowserContext* browser_context() { return browser_context_; } | 114 content::BrowserContext* browser_context() { return browser_context_; } |
114 | 115 |
115 void set_delegate(Delegate* delegate) { delegate_ = delegate; } | 116 void set_delegate(Delegate* delegate) { delegate_ = delegate; } |
116 | 117 |
117 private: | 118 private: |
118 // For a given RenderFrameHost instance, UIThreadResponseCallbackWrapper | 119 // For a given RenderFrameHost instance, UIThreadResponseCallbackWrapper |
119 // creates ExtensionFunction::ResponseCallback instances which send responses | 120 // creates ExtensionFunction::ResponseCallback instances which send responses |
120 // to the corresponding render view in ExtensionMsg_Response messages. | 121 // to the corresponding render view in ExtensionMsg_Response messages. |
121 // This class tracks the lifespan of the RenderFrameHost instance, and will be | 122 // This class tracks the lifespan of the RenderFrameHost instance, and will be |
122 // destroyed automatically when it goes away. | 123 // destroyed automatically when it goes away. |
123 class UIThreadResponseCallbackWrapper; | 124 class UIThreadResponseCallbackWrapper; |
124 | 125 |
126 // Same as UIThreadResponseCallbackWrapper above, but applies to an extension | |
127 // function from an extension Service Worker. | |
128 class UIThreadWorkerResponseCallbackWrapper; | |
129 | |
125 // Helper to check whether an ExtensionFunction has the required permissions. | 130 // Helper to check whether an ExtensionFunction has the required permissions. |
126 // This should be called after the function is fully initialized. | 131 // This should be called after the function is fully initialized. |
127 // If the check fails, |callback| is run with an access-denied error and false | 132 // If the check fails, |callback| is run with an access-denied error and false |
128 // is returned. |function| must not be run in that case. | 133 // is returned. |function| must not be run in that case. |
129 static bool CheckPermissions( | 134 static bool CheckPermissions( |
130 ExtensionFunction* function, | 135 ExtensionFunction* function, |
131 const ExtensionHostMsg_Request_Params& params, | 136 const ExtensionHostMsg_Request_Params& params, |
132 const ExtensionFunction::ResponseCallback& callback); | 137 const ExtensionFunction::ResponseCallback& callback); |
133 | 138 |
134 // Helper to create an ExtensionFunction to handle the function given by | 139 // Helper to create an ExtensionFunction to handle the function given by |
(...skipping 10 matching lines...) Expand all Loading... | |
145 | 150 |
146 // Helper to run the response callback with an access denied error. Can be | 151 // Helper to run the response callback with an access denied error. Can be |
147 // called on any thread. | 152 // called on any thread. |
148 static void SendAccessDenied( | 153 static void SendAccessDenied( |
149 const ExtensionFunction::ResponseCallback& callback, | 154 const ExtensionFunction::ResponseCallback& callback, |
150 functions::HistogramValue histogram_value); | 155 functions::HistogramValue histogram_value); |
151 | 156 |
152 void DispatchWithCallbackInternal( | 157 void DispatchWithCallbackInternal( |
153 const ExtensionHostMsg_Request_Params& params, | 158 const ExtensionHostMsg_Request_Params& params, |
154 content::RenderFrameHost* render_frame_host, | 159 content::RenderFrameHost* render_frame_host, |
160 int render_process_id, | |
155 const ExtensionFunction::ResponseCallback& callback); | 161 const ExtensionFunction::ResponseCallback& callback); |
156 | 162 |
163 void RemoveWorkerCallbacksForProcess(int render_process_id); | |
164 | |
157 content::BrowserContext* browser_context_; | 165 content::BrowserContext* browser_context_; |
158 | 166 |
159 Delegate* delegate_; | 167 Delegate* delegate_; |
160 | 168 |
161 // This map doesn't own either the keys or the values. When a RenderFrameHost | 169 // This map doesn't own either the keys or the values. When a RenderFrameHost |
162 // instance goes away, the corresponding entry in this map (if exists) will be | 170 // instance goes away, the corresponding entry in this map (if exists) will be |
163 // removed. | 171 // removed. |
164 typedef std::map<content::RenderFrameHost*, UIThreadResponseCallbackWrapper*> | 172 typedef std::map<content::RenderFrameHost*, UIThreadResponseCallbackWrapper*> |
165 UIThreadResponseCallbackWrapperMap; | 173 UIThreadResponseCallbackWrapperMap; |
166 UIThreadResponseCallbackWrapperMap ui_thread_response_callback_wrappers_; | 174 UIThreadResponseCallbackWrapperMap ui_thread_response_callback_wrappers_; |
175 | |
176 // The key is <render process id, embedded worker id>. | |
177 using UIThreadWorkerResponseCallbackWrapperMapKey = std::pair<int, int>; | |
dcheng
2016/05/11 23:41:18
This should just be a simple struct. The typedef i
lazyboy
2016/05/12 00:21:22
Done.
| |
178 using UIThreadWorkerResponseCallbackWrapperMap = | |
179 std::map<UIThreadWorkerResponseCallbackWrapperMapKey, | |
180 std::unique_ptr<UIThreadWorkerResponseCallbackWrapper>>; | |
181 // TODO(lazyboy): The map entries are cleared upon RenderProcessHost shutown, | |
182 // we should really be clearing it on service worker shutdown. | |
183 UIThreadWorkerResponseCallbackWrapperMap | |
184 ui_thread_response_callback_wrappers_for_worker_; | |
167 }; | 185 }; |
168 | 186 |
169 } // namespace extensions | 187 } // namespace extensions |
170 | 188 |
171 #endif // EXTENSIONS_BROWSER_EXTENSION_FUNCTION_DISPATCHER_H_ | 189 #endif // EXTENSIONS_BROWSER_EXTENSION_FUNCTION_DISPATCHER_H_ |
OLD | NEW |