blob: a4c255af86a474810d88f13af89512e32ce9e74e [file] [log] [blame]
[email protected]f34e79632010-03-17 02:34:081// Copyright (c) 2010 The Chromium Authors. All rights reserved.
[email protected]bfdffe2b2009-04-24 22:05:352// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/extensions/extension_function_dispatcher.h"
6
[email protected]745feedb2010-08-02 04:08:077#include <map>
8
[email protected]bfdffe2b2009-04-24 22:05:359#include "base/process_util.h"
10#include "base/singleton.h"
[email protected]584b8e3f2010-04-10 00:23:3711#include "base/ref_counted.h"
[email protected]bfdffe2b2009-04-24 22:05:3512#include "base/values.h"
[email protected]17d40f02010-07-01 01:18:0613#include "build/build_config.h"
[email protected]0ec92032010-03-24 19:59:4114#include "chrome/browser/browser_list.h"
[email protected]a95631cb2009-12-10 01:59:1115#include "chrome/browser/browser_window.h"
[email protected]584b8e3f2010-04-10 00:23:3716#include "chrome/browser/dom_ui/chrome_url_data_manager.h"
17#include "chrome/browser/dom_ui/dom_ui_favicon_source.h"
[email protected]d070ec62010-07-27 21:28:2618#include "chrome/browser/external_protocol_handler.h"
[email protected]912256b32009-09-18 09:47:3519#include "chrome/browser/extensions/execute_code_in_tab_function.h"
[email protected]5cbe1e22010-01-30 01:18:5620#include "chrome/browser/extensions/extension_accessibility_api.h"
[email protected]9dd97bc2010-01-14 01:40:0421#include "chrome/browser/extensions/extension_bookmark_manager_api.h"
[email protected]bfdffe2b2009-04-24 22:05:3522#include "chrome/browser/extensions/extension_bookmarks_module.h"
[email protected]f93914852009-05-26 06:05:4023#include "chrome/browser/extensions/extension_bookmarks_module_constants.h"
[email protected]ec9ac0df2009-10-01 18:06:4724#include "chrome/browser/extensions/extension_browser_actions_api.h"
[email protected]446255952010-03-17 20:41:5825#include "chrome/browser/extensions/extension_clipboard_api.h"
[email protected]2e3b5202010-03-23 06:52:4126#include "chrome/browser/extensions/extension_context_menu_api.h"
[email protected]898bbd32010-05-18 18:52:2927#include "chrome/browser/extensions/extension_cookies_api.h"
[email protected]b27257562009-11-16 23:28:2628#include "chrome/browser/extensions/extension_dom_ui.h"
[email protected]bfdffe2b2009-04-24 22:05:3529#include "chrome/browser/extensions/extension_function.h"
[email protected]de768a832009-10-30 05:25:0130#include "chrome/browser/extensions/extension_history_api.h"
[email protected]f5205412010-03-16 00:19:3431#include "chrome/browser/extensions/extension_idle_api.h"
[email protected]198bcfe2009-09-09 22:56:2832#include "chrome/browser/extensions/extension_i18n_api.h"
[email protected]f34e79632010-03-17 02:34:0833#include "chrome/browser/extensions/extension_infobar_module.h"
[email protected]e916901c2009-05-07 00:14:3134#include "chrome/browser/extensions/extension_message_service.h"
[email protected]438772df2010-02-26 18:08:4335#include "chrome/browser/extensions/extension_metrics_module.h"
[email protected]56ad3792010-05-28 17:45:3336#include "chrome/browser/extensions/extension_omnibox_api.h"
[email protected]f7f3a5f2009-05-01 22:02:3437#include "chrome/browser/extensions/extension_page_actions_module.h"
[email protected]f93914852009-05-26 06:05:4038#include "chrome/browser/extensions/extension_page_actions_module_constants.h"
[email protected]1c1c77a52009-11-03 00:37:3139#include "chrome/browser/extensions/extension_popup_api.h"
[email protected]45776222009-07-15 20:21:5840#include "chrome/browser/extensions/extension_process_manager.h"
[email protected]381162b2010-01-28 17:29:3541#include "chrome/browser/extensions/extension_processes_api.h"
[email protected]a9c23a52010-08-04 09:13:4442#include "chrome/browser/extensions/extension_proxy_api.h"
[email protected]17d40f02010-07-01 01:18:0643#include "chrome/browser/extensions/extension_rlz_module.h"
[email protected]bfdffe2b2009-04-24 22:05:3544#include "chrome/browser/extensions/extension_tabs_module.h"
[email protected]f93914852009-05-26 06:05:4045#include "chrome/browser/extensions/extension_tabs_module_constants.h"
[email protected]25fd1b2e2009-08-17 20:57:1446#include "chrome/browser/extensions/extension_test_api.h"
[email protected]8abe0a32010-08-12 00:40:2247#if defined(OS_CHROMEOS)
48#include "chrome/browser/extensions/extension_tts_api.h"
49#endif
[email protected]d13950e2009-12-04 01:43:0250#include "chrome/browser/extensions/extensions_quota_service.h"
[email protected]b1748b1d82009-11-30 20:32:5651#include "chrome/browser/extensions/extensions_service.h"
[email protected]e916901c2009-05-07 00:14:3152#include "chrome/browser/profile.h"
[email protected]bfdffe2b2009-04-24 22:05:3553#include "chrome/browser/renderer_host/render_process_host.h"
54#include "chrome/browser/renderer_host/render_view_host.h"
[email protected]35506352009-08-07 18:58:1955#include "chrome/common/render_messages.h"
[email protected]bfdffe2b2009-04-24 22:05:3556#include "chrome/common/result_codes.h"
[email protected]9c45b7182009-08-04 16:44:4357#include "chrome/common/url_constants.h"
[email protected]bfdffe2b2009-04-24 22:05:3558
59// FactoryRegistry -------------------------------------------------------------
60
61namespace {
62
[email protected]b83e4602009-05-15 22:58:3363// Template for defining ExtensionFunctionFactory.
64template<class T>
65ExtensionFunction* NewExtensionFunction() {
66 return new T();
67}
[email protected]bfdffe2b2009-04-24 22:05:3568
[email protected]b83e4602009-05-15 22:58:3369// Contains a list of all known extension functions and allows clients to
70// create instances of them.
[email protected]bfdffe2b2009-04-24 22:05:3571class FactoryRegistry {
72 public:
73 static FactoryRegistry* instance();
[email protected]b83e4602009-05-15 22:58:3374 FactoryRegistry() { ResetFunctions(); }
75
76 // Resets all functions to their default values.
77 void ResetFunctions();
78
79 // Adds all function names to 'names'.
[email protected]bfdffe2b2009-04-24 22:05:3580 void GetAllNames(std::vector<std::string>* names);
[email protected]b83e4602009-05-15 22:58:3381
82 // Allows overriding of specific functions (e.g. for testing). Functions
83 // must be previously registered. Returns true if successful.
84 bool OverrideFunction(const std::string& name,
85 ExtensionFunctionFactory factory);
86
87 // Factory method for the ExtensionFunction registered as 'name'.
[email protected]bfdffe2b2009-04-24 22:05:3588 ExtensionFunction* NewFunction(const std::string& name);
89
90 private:
[email protected]61424c062009-10-14 23:14:5991 template<class T>
92 void RegisterFunction() {
93 factories_[T::function_name()] = &NewExtensionFunction<T>;
94 }
95
[email protected]bfdffe2b2009-04-24 22:05:3596 typedef std::map<std::string, ExtensionFunctionFactory> FactoryMap;
97 FactoryMap factories_;
98};
99
[email protected]bfdffe2b2009-04-24 22:05:35100FactoryRegistry* FactoryRegistry::instance() {
101 return Singleton<FactoryRegistry>::get();
102}
103
[email protected]b83e4602009-05-15 22:58:33104void FactoryRegistry::ResetFunctions() {
[email protected]bfdffe2b2009-04-24 22:05:35105 // Register all functions here.
106
[email protected]e515f5d2009-05-05 03:05:00107 // Windows
[email protected]61424c062009-10-14 23:14:59108 RegisterFunction<GetWindowFunction>();
109 RegisterFunction<GetCurrentWindowFunction>();
110 RegisterFunction<GetLastFocusedWindowFunction>();
111 RegisterFunction<GetAllWindowsFunction>();
112 RegisterFunction<CreateWindowFunction>();
113 RegisterFunction<UpdateWindowFunction>();
114 RegisterFunction<RemoveWindowFunction>();
[email protected]b83e4602009-05-15 22:58:33115
[email protected]e515f5d2009-05-05 03:05:00116 // Tabs
[email protected]61424c062009-10-14 23:14:59117 RegisterFunction<GetTabFunction>();
[email protected]e3eafb292010-04-14 21:30:41118 RegisterFunction<GetCurrentTabFunction>();
[email protected]61424c062009-10-14 23:14:59119 RegisterFunction<GetSelectedTabFunction>();
120 RegisterFunction<GetAllTabsInWindowFunction>();
121 RegisterFunction<CreateTabFunction>();
122 RegisterFunction<UpdateTabFunction>();
123 RegisterFunction<MoveTabFunction>();
124 RegisterFunction<RemoveTabFunction>();
125 RegisterFunction<DetectTabLanguageFunction>();
126 RegisterFunction<CaptureVisibleTabFunction>();
127 RegisterFunction<TabsExecuteScriptFunction>();
128 RegisterFunction<TabsInsertCSSFunction>();
[email protected]bfdffe2b2009-04-24 22:05:35129
[email protected]f7f3a5f2009-05-01 22:02:34130 // Page Actions.
[email protected]61424c062009-10-14 23:14:59131 RegisterFunction<EnablePageActionFunction>();
132 RegisterFunction<DisablePageActionFunction>();
[email protected]744ef172009-10-16 21:53:46133 RegisterFunction<PageActionShowFunction>();
134 RegisterFunction<PageActionHideFunction>();
135 RegisterFunction<PageActionSetIconFunction>();
136 RegisterFunction<PageActionSetTitleFunction>();
[email protected]e478d6702010-01-28 00:10:29137 RegisterFunction<PageActionSetPopupFunction>();
[email protected]f7f3a5f2009-05-01 22:02:34138
[email protected]ec9ac0df2009-10-01 18:06:47139 // Browser Actions.
[email protected]61424c062009-10-14 23:14:59140 RegisterFunction<BrowserActionSetIconFunction>();
[email protected]1288ba02009-10-15 00:02:24141 RegisterFunction<BrowserActionSetTitleFunction>();
[email protected]61424c062009-10-14 23:14:59142 RegisterFunction<BrowserActionSetBadgeTextFunction>();
143 RegisterFunction<BrowserActionSetBadgeBackgroundColorFunction>();
[email protected]85ae9592010-02-03 20:58:50144 RegisterFunction<BrowserActionSetPopupFunction>();
[email protected]ec9ac0df2009-10-01 18:06:47145
[email protected]f7f3a5f2009-05-01 22:02:34146 // Bookmarks.
[email protected]61424c062009-10-14 23:14:59147 RegisterFunction<GetBookmarksFunction>();
148 RegisterFunction<GetBookmarkChildrenFunction>();
[email protected]a3c94c712009-12-18 19:23:55149 RegisterFunction<GetBookmarkRecentFunction>();
[email protected]61424c062009-10-14 23:14:59150 RegisterFunction<GetBookmarkTreeFunction>();
151 RegisterFunction<SearchBookmarksFunction>();
152 RegisterFunction<RemoveBookmarkFunction>();
153 RegisterFunction<RemoveTreeBookmarkFunction>();
154 RegisterFunction<CreateBookmarkFunction>();
155 RegisterFunction<MoveBookmarkFunction>();
156 RegisterFunction<UpdateBookmarkFunction>();
[email protected]9c45b7182009-08-04 16:44:43157
[email protected]f34e79632010-03-17 02:34:08158 // Infobars.
159 RegisterFunction<ShowInfoBarFunction>();
160
[email protected]9dd97bc2010-01-14 01:40:04161 // BookmarkManager
162 RegisterFunction<CopyBookmarkManagerFunction>();
163 RegisterFunction<CutBookmarkManagerFunction>();
164 RegisterFunction<PasteBookmarkManagerFunction>();
[email protected]03b3bbf2010-01-29 23:54:57165 RegisterFunction<CanPasteBookmarkManagerFunction>();
[email protected]cb6cf792010-01-28 00:04:56166 RegisterFunction<ImportBookmarksFunction>();
167 RegisterFunction<ExportBookmarksFunction>();
[email protected]d406e2e2010-01-30 21:45:18168 RegisterFunction<SortChildrenBookmarkManagerFunction>();
[email protected]9dd97bc2010-01-14 01:40:04169 RegisterFunction<BookmarkManagerGetStringsFunction>();
[email protected]ced90ae12010-02-20 02:06:16170 RegisterFunction<StartDragBookmarkManagerFunction>();
171 RegisterFunction<DropBookmarkManagerFunction>();
[email protected]9b071852010-04-02 06:45:31172 RegisterFunction<GetSubtreeBookmarkManagerFunction>();
[email protected]9dd97bc2010-01-14 01:40:04173
[email protected]de768a832009-10-30 05:25:01174 // History
175 RegisterFunction<AddUrlHistoryFunction>();
176 RegisterFunction<DeleteAllHistoryFunction>();
177 RegisterFunction<DeleteRangeHistoryFunction>();
178 RegisterFunction<DeleteUrlHistoryFunction>();
179 RegisterFunction<GetVisitsHistoryFunction>();
180 RegisterFunction<SearchHistoryFunction>();
181
[email protected]f5205412010-03-16 00:19:34182 // Idle
183 RegisterFunction<ExtensionIdleQueryStateFunction>();
184
[email protected]198bcfe2009-09-09 22:56:28185 // I18N.
[email protected]61424c062009-10-14 23:14:59186 RegisterFunction<GetAcceptLanguagesFunction>();
[email protected]198bcfe2009-09-09 22:56:28187
[email protected]1c1c77a52009-11-03 00:37:31188 // Popup API.
189 RegisterFunction<PopupShowFunction>();
190
[email protected]381162b2010-01-28 17:29:35191 // Processes.
192 RegisterFunction<GetProcessForTabFunction>();
193
[email protected]438772df2010-02-26 18:08:43194 // Metrics.
[email protected]cf25e4d2010-03-12 21:19:34195 RegisterFunction<MetricsRecordUserActionFunction>();
196 RegisterFunction<MetricsRecordValueFunction>();
197 RegisterFunction<MetricsRecordPercentageFunction>();
198 RegisterFunction<MetricsRecordCountFunction>();
199 RegisterFunction<MetricsRecordSmallCountFunction>();
200 RegisterFunction<MetricsRecordMediumCountFunction>();
201 RegisterFunction<MetricsRecordTimeFunction>();
202 RegisterFunction<MetricsRecordMediumTimeFunction>();
203 RegisterFunction<MetricsRecordLongTimeFunction>();
[email protected]438772df2010-02-26 18:08:43204
[email protected]17d40f02010-07-01 01:18:06205 // RLZ.
206#if defined(OS_WIN)
207 RegisterFunction<RlzRecordProductEventFunction>();
208 RegisterFunction<RlzGetAccessPointRlzFunction>();
[email protected]3a612be2010-07-17 03:11:21209 RegisterFunction<RlzSendFinancialPingFunction>();
[email protected]17d40f02010-07-01 01:18:06210 RegisterFunction<RlzClearProductStateFunction>();
211#endif
212
[email protected]898bbd32010-05-18 18:52:29213 // Cookies.
214 RegisterFunction<GetCookieFunction>();
215 RegisterFunction<GetAllCookiesFunction>();
216 RegisterFunction<SetCookieFunction>();
217 RegisterFunction<RemoveCookieFunction>();
218 RegisterFunction<GetAllCookieStoresFunction>();
219
[email protected]25fd1b2e2009-08-17 20:57:14220 // Test.
[email protected]61424c062009-10-14 23:14:59221 RegisterFunction<ExtensionTestPassFunction>();
222 RegisterFunction<ExtensionTestFailFunction>();
223 RegisterFunction<ExtensionTestLogFunction>();
[email protected]d13950e2009-12-04 01:43:02224 RegisterFunction<ExtensionTestQuotaResetFunction>();
[email protected]db7331a2010-02-25 22:10:50225 RegisterFunction<ExtensionTestCreateIncognitoTabFunction>();
[email protected]745feedb2010-08-02 04:08:07226 RegisterFunction<ExtensionTestSendMessageFunction>();
[email protected]5cbe1e22010-01-30 01:18:56227
228 // Accessibility.
229 RegisterFunction<GetFocusedControlFunction>();
230 RegisterFunction<SetAccessibilityEnabledFunction>();
[email protected]446255952010-03-17 20:41:58231
[email protected]8abe0a32010-08-12 00:40:22232#if defined(OS_CHROMEOS)
233 // Text-to-speech.
234 RegisterFunction<ExtensionTtsSpeakFunction>();
235 RegisterFunction<ExtensionTtsStopSpeakingFunction>();
236 RegisterFunction<ExtensionTtsIsSpeakingFunction>();
237#endif
238
[email protected]446255952010-03-17 20:41:58239 // Clipboard.
240 RegisterFunction<ExecuteCopyClipboardFunction>();
241 RegisterFunction<ExecuteCutClipboardFunction>();
242 RegisterFunction<ExecutePasteClipboardFunction>();
[email protected]2e3b5202010-03-23 06:52:41243
244 // Context Menus.
245 RegisterFunction<CreateContextMenuFunction>();
[email protected]66dbfb2c2010-05-12 20:20:15246 RegisterFunction<UpdateContextMenuFunction>();
[email protected]2e3b5202010-03-23 06:52:41247 RegisterFunction<RemoveContextMenuFunction>();
[email protected]66dbfb2c2010-05-12 20:20:15248 RegisterFunction<RemoveAllContextMenusFunction>();
[email protected]56ad3792010-05-28 17:45:33249
250 // Omnibox.
251 RegisterFunction<OmniboxSendSuggestionsFunction>();
[email protected]a9c23a52010-08-04 09:13:44252
253 // Proxies.
254 RegisterFunction<UseCustomProxySettingsFunction>();
[email protected]bfdffe2b2009-04-24 22:05:35255}
256
[email protected]b83e4602009-05-15 22:58:33257void FactoryRegistry::GetAllNames(std::vector<std::string>* names) {
258 for (FactoryMap::iterator iter = factories_.begin();
259 iter != factories_.end(); ++iter) {
[email protected]bfdffe2b2009-04-24 22:05:35260 names->push_back(iter->first);
261 }
262}
263
[email protected]b83e4602009-05-15 22:58:33264bool FactoryRegistry::OverrideFunction(const std::string& name,
265 ExtensionFunctionFactory factory) {
266 FactoryMap::iterator iter = factories_.find(name);
267 if (iter == factories_.end()) {
268 return false;
269 } else {
270 iter->second = factory;
271 return true;
272 }
273}
274
[email protected]bfdffe2b2009-04-24 22:05:35275ExtensionFunction* FactoryRegistry::NewFunction(const std::string& name) {
276 FactoryMap::iterator iter = factories_.find(name);
277 DCHECK(iter != factories_.end());
[email protected]b83e4602009-05-15 22:58:33278 ExtensionFunction* function = iter->second();
[email protected]76a3db852009-07-24 02:14:56279 function->set_name(name);
[email protected]b83e4602009-05-15 22:58:33280 return function;
[email protected]bfdffe2b2009-04-24 22:05:35281}
282
[email protected]b83e4602009-05-15 22:58:33283}; // namespace
[email protected]bfdffe2b2009-04-24 22:05:35284
[email protected]bfdffe2b2009-04-24 22:05:35285// ExtensionFunctionDispatcher -------------------------------------------------
286
287void ExtensionFunctionDispatcher::GetAllFunctionNames(
288 std::vector<std::string>* names) {
289 FactoryRegistry::instance()->GetAllNames(names);
290}
291
[email protected]b83e4602009-05-15 22:58:33292bool ExtensionFunctionDispatcher::OverrideFunction(
293 const std::string& name, ExtensionFunctionFactory factory) {
294 return FactoryRegistry::instance()->OverrideFunction(name, factory);
295}
296
297void ExtensionFunctionDispatcher::ResetFunctions() {
298 FactoryRegistry::instance()->ResetFunctions();
299}
300
[email protected]a91afcb2010-03-25 21:15:02301ExtensionFunctionDispatcher* ExtensionFunctionDispatcher::Create(
302 RenderViewHost* render_view_host,
303 Delegate* delegate,
304 const GURL& url) {
305 ExtensionsService* service =
306 render_view_host->process()->profile()->GetExtensionsService();
307 DCHECK(service);
308
309 Extension* extension = service->GetExtensionByURL(url);
310 if (extension)
311 return new ExtensionFunctionDispatcher(render_view_host, delegate,
312 extension, url);
313 else
314 return NULL;
315}
316
[email protected]bfdffe2b2009-04-24 22:05:35317ExtensionFunctionDispatcher::ExtensionFunctionDispatcher(
318 RenderViewHost* render_view_host,
[email protected]7eecaed52009-05-07 21:44:12319 Delegate* delegate,
[email protected]a91afcb2010-03-25 21:15:02320 Extension* extension,
[email protected]811bfe32009-07-01 08:46:25321 const GURL& url)
[email protected]ebc1b682010-03-06 00:22:30322 : profile_(render_view_host->process()->profile()),
[email protected]68f07912010-03-05 18:33:58323 render_view_host_(render_view_host),
[email protected]7eecaed52009-05-07 21:44:12324 delegate_(delegate),
[email protected]811bfe32009-07-01 08:46:25325 url_(url),
[email protected]32dda362009-06-05 19:07:01326 ALLOW_THIS_IN_INITIALIZER_LIST(peer_(new Peer(this))) {
[email protected]9c45b7182009-08-04 16:44:43327 // TODO(erikkay) should we do something for these errors in Release?
328 DCHECK(url.SchemeIs(chrome::kExtensionScheme));
[email protected]35506352009-08-07 18:58:19329 DCHECK(extension);
[email protected]9c45b7182009-08-04 16:44:43330
[email protected]45776222009-07-15 20:21:58331 // Notify the ExtensionProcessManager that the view was created.
332 ExtensionProcessManager* epm = profile()->GetExtensionProcessManager();
333 epm->RegisterExtensionProcess(extension_id(),
[email protected]76543b92009-08-31 17:27:45334 render_view_host->process()->id());
[email protected]35506352009-08-07 18:58:19335
[email protected]db7331a2010-02-25 22:10:50336 bool incognito_enabled =
[email protected]cb0ce1e022010-03-10 19:54:41337 profile()->GetExtensionsService()->IsIncognitoEnabled(extension);
[email protected]db7331a2010-02-25 22:10:50338
[email protected]584b8e3f2010-04-10 00:23:37339 // If the extension has permission to load chrome://favicon/ resources we need
340 // to make sure that the DOMUIFavIconSource is registered with the
341 // ChromeURLDataManager.
342 if (extension->HasHostPermission(GURL(chrome::kChromeUIFavIconURL))) {
343 DOMUIFavIconSource* favicon_source = new DOMUIFavIconSource(profile_);
344 ChromeThread::PostTask(
345 ChromeThread::IO, FROM_HERE,
346 NewRunnableMethod(Singleton<ChromeURLDataManager>::get(),
347 &ChromeURLDataManager::AddDataSource,
348 make_scoped_refptr(favicon_source)));
349 }
350
[email protected]35506352009-08-07 18:58:19351 // Update the extension permissions. Doing this each time we create an EFD
352 // ensures that new processes are informed of permissions for newly installed
353 // extensions.
[email protected]cccf90932009-08-23 17:56:25354 render_view_host->Send(new ViewMsg_Extension_SetAPIPermissions(
[email protected]35506352009-08-07 18:58:19355 extension->id(), extension->api_permissions()));
[email protected]cccf90932009-08-23 17:56:25356 render_view_host->Send(new ViewMsg_Extension_SetHostPermissions(
357 extension->url(), extension->host_permissions()));
[email protected]db7331a2010-02-25 22:10:50358 render_view_host->Send(new ViewMsg_Extension_ExtensionSetIncognitoEnabled(
359 extension->id(), incognito_enabled));
[email protected]68f07912010-03-05 18:33:58360
361 NotificationService::current()->Notify(
362 NotificationType::EXTENSION_FUNCTION_DISPATCHER_CREATED,
363 Source<Profile>(profile_),
364 Details<ExtensionFunctionDispatcher>(this));
[email protected]bfdffe2b2009-04-24 22:05:35365}
366
[email protected]32dda362009-06-05 19:07:01367ExtensionFunctionDispatcher::~ExtensionFunctionDispatcher() {
[email protected]32dda362009-06-05 19:07:01368 peer_->dispatcher_ = NULL;
[email protected]68f07912010-03-05 18:33:58369
370 NotificationService::current()->Notify(
371 NotificationType::EXTENSION_FUNCTION_DISPATCHER_DESTROYED,
372 Source<Profile>(profile_),
373 Details<ExtensionFunctionDispatcher>(this));
[email protected]32dda362009-06-05 19:07:01374}
375
[email protected]0ec92032010-03-24 19:59:41376Browser* ExtensionFunctionDispatcher::GetCurrentBrowser(
377 bool include_incognito) {
378 Browser* browser = delegate_->GetBrowser();
[email protected]7eecaed52009-05-07 21:44:12379
[email protected]0ec92032010-03-24 19:59:41380 // If the delegate has an associated browser and that browser is in the right
381 // incognito state, we can return it.
382 if (browser) {
383 if (include_incognito || !browser->profile()->IsOffTheRecord())
384 return browser;
385 }
[email protected]9c45b7182009-08-04 16:44:43386
[email protected]0ec92032010-03-24 19:59:41387 // Otherwise, try to default to a reasonable browser.
388 Profile* profile = render_view_host()->process()->profile();
389
390 // Make sure we don't return an incognito browser without proper access.
391 if (!include_incognito)
392 profile = profile->GetOriginalProfile();
393
[email protected]62b0b532010-03-26 22:44:31394 browser = BrowserList::FindBrowserWithType(profile, Browser::TYPE_ANY,
395 include_incognito);
[email protected]0ec92032010-03-24 19:59:41396
[email protected]0ec92032010-03-24 19:59:41397 // NOTE(rafaelw): This can return NULL in some circumstances. In particular,
[email protected]6d7a6042010-08-12 20:12:42398 // a background_page onload chrome.tabs api call can make it into here
399 // before the browser is sufficiently initialized to return here.
[email protected]0ec92032010-03-24 19:59:41400 // A similar situation may arise during shutdown.
401 // TODO(rafaelw): Delay creation of background_page until the browser
402 // is available. http://code.google.com/p/chromium/issues/detail?id=13284
403 return browser;
[email protected]b27257562009-11-16 23:28:26404}
405
[email protected]bfdffe2b2009-04-24 22:05:35406void ExtensionFunctionDispatcher::HandleRequest(const std::string& name,
[email protected]438c97d2010-05-21 23:30:15407 const ListValue* args,
[email protected]bb64b512010-04-02 21:01:39408 const GURL& source_url,
[email protected]c6619182009-05-12 14:59:32409 int request_id,
410 bool has_callback) {
[email protected]32dda362009-06-05 19:07:01411 scoped_refptr<ExtensionFunction> function(
[email protected]bfdffe2b2009-04-24 22:05:35412 FactoryRegistry::instance()->NewFunction(name));
[email protected]32dda362009-06-05 19:07:01413 function->set_dispatcher_peer(peer_);
[email protected]a7664e12010-04-08 20:37:43414 function->set_profile(profile_);
415 function->set_extension_id(extension_id());
[email protected]b83e4602009-05-15 22:58:33416 function->SetArgs(args);
[email protected]bb64b512010-04-02 21:01:39417 function->set_source_url(source_url);
[email protected]c6619182009-05-12 14:59:32418 function->set_request_id(request_id);
419 function->set_has_callback(has_callback);
[email protected]d13950e2009-12-04 01:43:02420 ExtensionsService* service = profile()->GetExtensionsService();
421 DCHECK(service);
[email protected]cb0ce1e022010-03-10 19:54:41422 Extension* extension = service->GetExtensionById(extension_id(), false);
423 DCHECK(extension);
424 function->set_include_incognito(service->IsIncognitoEnabled(extension));
425
[email protected]d13950e2009-12-04 01:43:02426 ExtensionsQuotaService* quota = service->quota_service();
427 if (quota->Assess(extension_id(), function, args, base::TimeTicks::Now())) {
[email protected]d070ec62010-07-27 21:28:26428 // See crbug.com/39178.
429 ExternalProtocolHandler::PermitLaunchUrl();
430
[email protected]d13950e2009-12-04 01:43:02431 function->Run();
432 } else {
433 render_view_host_->SendExtensionResponse(function->request_id(), false,
434 std::string(), QuotaLimitHeuristic::kGenericOverQuotaError);
435 }
[email protected]bfdffe2b2009-04-24 22:05:35436}
437
[email protected]c6619182009-05-12 14:59:32438void ExtensionFunctionDispatcher::SendResponse(ExtensionFunction* function,
439 bool success) {
[email protected]c6619182009-05-12 14:59:32440 render_view_host_->SendExtensionResponse(function->request_id(), success,
[email protected]b83e4602009-05-15 22:58:33441 function->GetResult(), function->GetError());
[email protected]bfdffe2b2009-04-24 22:05:35442}
443
444void ExtensionFunctionDispatcher::HandleBadMessage(ExtensionFunction* api) {
[email protected]25fd1b2e2009-08-17 20:57:14445 LOG(ERROR) << "bad extension message " <<
[email protected]76543b92009-08-31 17:27:45446 api->name() <<
[email protected]bfdffe2b2009-04-24 22:05:35447 " : terminating renderer.";
448 if (RenderProcessHost::run_renderer_in_process()) {
449 // In single process mode it is better if we don't suicide but just crash.
450 CHECK(false);
451 } else {
452 NOTREACHED();
[email protected]201b2732009-11-13 18:57:46453 base::KillProcess(render_view_host_->process()->GetHandle(),
[email protected]bfdffe2b2009-04-24 22:05:35454 ResultCodes::KILLED_BAD_MESSAGE, false);
455 }
456}
457
458Profile* ExtensionFunctionDispatcher::profile() {
[email protected]68f07912010-03-05 18:33:58459 return profile_;
[email protected]bfdffe2b2009-04-24 22:05:35460}