172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_function_dispatcher.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <map> 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/process_util.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "build/build_config.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/execute_code_in_tab_function.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_accessibility_api.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_bookmark_manager_api.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_bookmarks_module.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_browser_actions_api.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_clipboard_api.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_context_menu_api.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_cookies_api.h" 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_debugger_api.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_function.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_history_api.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_i18n_api.h" 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/extensions/extension_idle_api.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_infobar_module.h" 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/extensions/extension_management_api.h" 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_message_service.h" 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_metrics_module.h" 314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/extensions/extension_module.h" 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_omnibox_api.h" 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_page_actions_module.h" 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/extensions/extension_preference_api.h" 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_process_manager.h" 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_processes_api.h" 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/extensions/extension_proxy_api.h" 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_rlz_module.h" 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/extensions/extension_service.h" 403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/extensions/extension_sidebar_api.h" 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_tabs_module.h" 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_test_api.h" 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/extensions/extension_tts_api.h" 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/extensions/extension_web_ui.h" 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/extensions/extension_webrequest_api.h" 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/extensions/extension_webstore_private_api.h" 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extensions_quota_service.h" 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/external_protocol_handler.h" 4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/metrics/user_metrics.h" 5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h" 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_window.h" 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/chrome_url_data_manager.h" 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/favicon_source.h" 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/extensions/extension_messages.h" 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h" 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h" 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h" 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/result_codes.h" 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "third_party/skia/include/core/SkBitmap.h" 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(TOOLKIT_VIEWS) 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/extensions/extension_input_api.h" 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_CHROMEOS) 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_file_browser_private_api.h" 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_info_private_api_chromeos.h" 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// FactoryRegistry ------------------------------------------------------------- 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Template for defining ExtensionFunctionFactory. 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate<class T> 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionFunction* NewExtensionFunction() { 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return new T(); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Contains a list of all known extension functions and allows clients to 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// create instances of them. 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FactoryRegistry { 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 8621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen static FactoryRegistry* GetInstance(); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FactoryRegistry() { ResetFunctions(); } 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Resets all functions to their default values. 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ResetFunctions(); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Adds all function names to 'names'. 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void GetAllNames(std::vector<std::string>* names); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Allows overriding of specific functions (e.g. for testing). Functions 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // must be previously registered. Returns true if successful. 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool OverrideFunction(const std::string& name, 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionFunctionFactory factory); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Factory method for the ExtensionFunction registered as 'name'. 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionFunction* NewFunction(const std::string& name); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch template<class T> 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RegisterFunction() { 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch factories_[T::function_name()] = &NewExtensionFunction<T>; 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::map<std::string, ExtensionFunctionFactory> FactoryMap; 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FactoryMap factories_; 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenFactoryRegistry* FactoryRegistry::GetInstance() { 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return Singleton<FactoryRegistry>::get(); 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FactoryRegistry::ResetFunctions() { 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Register all functions here. 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Windows 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetWindowFunction>(); 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetCurrentWindowFunction>(); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetLastFocusedWindowFunction>(); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetAllWindowsFunction>(); 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<CreateWindowFunction>(); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<UpdateWindowFunction>(); 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<RemoveWindowFunction>(); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Tabs 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetTabFunction>(); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetCurrentTabFunction>(); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetSelectedTabFunction>(); 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetAllTabsInWindowFunction>(); 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<CreateTabFunction>(); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<UpdateTabFunction>(); 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<MoveTabFunction>(); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<RemoveTabFunction>(); 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<DetectTabLanguageFunction>(); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<CaptureVisibleTabFunction>(); 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<TabsExecuteScriptFunction>(); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<TabsInsertCSSFunction>(); 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Page Actions. 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<EnablePageActionFunction>(); 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<DisablePageActionFunction>(); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<PageActionShowFunction>(); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<PageActionHideFunction>(); 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<PageActionSetIconFunction>(); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<PageActionSetTitleFunction>(); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<PageActionSetPopupFunction>(); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Browser Actions. 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<BrowserActionSetIconFunction>(); 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<BrowserActionSetTitleFunction>(); 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<BrowserActionSetBadgeTextFunction>(); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<BrowserActionSetBadgeBackgroundColorFunction>(); 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<BrowserActionSetPopupFunction>(); 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Bookmarks. 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetBookmarksFunction>(); 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetBookmarkChildrenFunction>(); 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetBookmarkRecentFunction>(); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetBookmarkTreeFunction>(); 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<SearchBookmarksFunction>(); 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<RemoveBookmarkFunction>(); 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<RemoveTreeBookmarkFunction>(); 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<CreateBookmarkFunction>(); 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<MoveBookmarkFunction>(); 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<UpdateBookmarkFunction>(); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Infobars. 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<ShowInfoBarFunction>(); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // BookmarkManager 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<CopyBookmarkManagerFunction>(); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<CutBookmarkManagerFunction>(); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<PasteBookmarkManagerFunction>(); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<CanPasteBookmarkManagerFunction>(); 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<ImportBookmarksFunction>(); 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<ExportBookmarksFunction>(); 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<SortChildrenBookmarkManagerFunction>(); 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<BookmarkManagerGetStringsFunction>(); 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<StartDragBookmarkManagerFunction>(); 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<DropBookmarkManagerFunction>(); 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetSubtreeBookmarkManagerFunction>(); 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // History 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<AddUrlHistoryFunction>(); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<DeleteAllHistoryFunction>(); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<DeleteRangeHistoryFunction>(); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<DeleteUrlHistoryFunction>(); 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetVisitsHistoryFunction>(); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<SearchHistoryFunction>(); 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Idle 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<ExtensionIdleQueryStateFunction>(); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // I18N. 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetAcceptLanguagesFunction>(); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Processes. 202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RegisterFunction<GetProcessIdForTabFunction>(); 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Metrics. 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RegisterFunction<MetricsGetEnabledFunction>(); 20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RegisterFunction<MetricsSetEnabledFunction>(); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<MetricsRecordUserActionFunction>(); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<MetricsRecordValueFunction>(); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<MetricsRecordPercentageFunction>(); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<MetricsRecordCountFunction>(); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<MetricsRecordSmallCountFunction>(); 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<MetricsRecordMediumCountFunction>(); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<MetricsRecordTimeFunction>(); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<MetricsRecordMediumTimeFunction>(); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<MetricsRecordLongTimeFunction>(); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // RLZ. 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<RlzRecordProductEventFunction>(); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<RlzGetAccessPointRlzFunction>(); 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<RlzSendFinancialPingFunction>(); 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<RlzClearProductStateFunction>(); 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Cookies. 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetCookieFunction>(); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetAllCookiesFunction>(); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<SetCookieFunction>(); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<RemoveCookieFunction>(); 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetAllCookieStoresFunction>(); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test. 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<ExtensionTestPassFunction>(); 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<ExtensionTestFailFunction>(); 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<ExtensionTestLogFunction>(); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<ExtensionTestQuotaResetFunction>(); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<ExtensionTestCreateIncognitoTabFunction>(); 2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<ExtensionTestSendMessageFunction>(); 239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RegisterFunction<ExtensionTestGetConfigFunction>(); 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Accessibility. 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<GetFocusedControlFunction>(); 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<SetAccessibilityEnabledFunction>(); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Text-to-speech. 2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<ExtensionTtsSpeakFunction>(); 2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<ExtensionTtsStopSpeakingFunction>(); 2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<ExtensionTtsIsSpeakingFunction>(); 24921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen RegisterFunction<ExtensionTtsSpeakCompletedFunction>(); 2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Clipboard. 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<ExecuteCopyClipboardFunction>(); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<ExecuteCutClipboardFunction>(); 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<ExecutePasteClipboardFunction>(); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Context Menus. 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<CreateContextMenuFunction>(); 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<UpdateContextMenuFunction>(); 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<RemoveContextMenuFunction>(); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<RemoveAllContextMenusFunction>(); 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Omnibox. 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterFunction<OmniboxSendSuggestionsFunction>(); 264201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch RegisterFunction<OmniboxSetDefaultSuggestionFunction>(); 2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Sidebar. 2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<CollapseSidebarFunction>(); 2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<ExpandSidebarFunction>(); 2693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<GetStateSidebarFunction>(); 2703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<HideSidebarFunction>(); 2713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<NavigateSidebarFunction>(); 2723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<SetBadgeTextSidebarFunction>(); 2733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<SetIconSidebarFunction>(); 2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<SetTitleSidebarFunction>(); 2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<ShowSidebarFunction>(); 2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(TOOLKIT_VIEWS) 2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Input. 2793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<SendKeyboardEventInputFunction>(); 2803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Management. 2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<GetAllExtensionsFunction>(); 284513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch RegisterFunction<GetExtensionByIdFunction>(); 2853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<LaunchAppFunction>(); 2863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<SetEnabledFunction>(); 2873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<UninstallFunction>(); 2883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Extension module. 2904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch RegisterFunction<SetUpdateUrlDataFunction>(); 291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<IsAllowedIncognitoAccessFunction>(); 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<IsAllowedFileSchemeAccessFunction>(); 2934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // WebstorePrivate. 295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RegisterFunction<GetBrowserLoginFunction>(); 2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<GetStoreLoginFunction>(); 2973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterFunction<SetStoreLoginFunction>(); 298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RegisterFunction<PromptBrowserLoginFunction>(); 2994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch RegisterFunction<BeginInstallFunction>(); 300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<BeginInstallWithManifestFunction>(); 3014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch RegisterFunction<CompleteInstallFunction>(); 30272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // WebRequest. 30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RegisterFunction<WebRequestAddEventListener>(); 305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<WebRequestEventHandled>(); 306dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Preferences. 308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen RegisterFunction<GetPreferenceFunction>(); 309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen RegisterFunction<SetPreferenceFunction>(); 310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen RegisterFunction<ClearPreferenceFunction>(); 311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // ChromeOS-specific part of the API. 313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_CHROMEOS) 314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Device Customization. 315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<GetChromeosInfoFunction>(); 316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // FileBrowserPrivate functions. 318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<CancelFileDialogFunction>(); 319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<ExecuteTasksFileBrowserFunction>(); 320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<FileDialogStringsFunction>(); 321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<GetFileTasksFileBrowserFunction>(); 322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<RequestLocalFileSystemFunction>(); 323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<SelectFileFunction>(); 324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<SelectFilesFunction>(); 325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<ViewFilesFunction>(); 326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Debugger 329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<AttachDebuggerFunction>(); 330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<DetachDebuggerFunction>(); 331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterFunction<SendRequestDebuggerFunction>(); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FactoryRegistry::GetAllNames(std::vector<std::string>* names) { 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (FactoryMap::iterator iter = factories_.begin(); 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iter != factories_.end(); ++iter) { 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch names->push_back(iter->first); 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool FactoryRegistry::OverrideFunction(const std::string& name, 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionFunctionFactory factory) { 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FactoryMap::iterator iter = factories_.find(name); 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (iter == factories_.end()) { 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch iter->second = factory; 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionFunction* FactoryRegistry::NewFunction(const std::string& name) { 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FactoryMap::iterator iter = factories_.find(name); 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(iter != factories_.end()); 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionFunction* function = iter->second(); 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch function->set_name(name); 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return function; 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; // namespace 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExtensionFunctionDispatcher ------------------------------------------------- 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionFunctionDispatcher::GetAllFunctionNames( 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<std::string>* names) { 36621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FactoryRegistry::GetInstance()->GetAllNames(names); 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExtensionFunctionDispatcher::OverrideFunction( 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& name, ExtensionFunctionFactory factory) { 37121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return FactoryRegistry::GetInstance()->OverrideFunction(name, factory); 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionFunctionDispatcher::ResetFunctions() { 37521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FactoryRegistry::GetInstance()->ResetFunctions(); 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionFunctionDispatcher* ExtensionFunctionDispatcher::Create( 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RenderViewHost* render_view_host, 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Delegate* delegate, 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url) { 38221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ExtensionService* service = 38321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen render_view_host->process()->profile()->GetExtensionService(); 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(service); 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!service->ExtensionBindingsAllowed(url)) 3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return NULL; 3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 389513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension = service->GetExtensionByURL(url); 3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!extension) 3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick extension = service->GetExtensionByWebExtent(url); 3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (extension) 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return new ExtensionFunctionDispatcher(render_view_host, delegate, 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extension, url); 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NULL; 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionFunctionDispatcher::ExtensionFunctionDispatcher( 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RenderViewHost* render_view_host, 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Delegate* delegate, 403513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension, 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url) 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : profile_(render_view_host->process()->profile()), 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch render_view_host_(render_view_host), 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delegate_(delegate), 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url_(url), 4093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick extension_id_(extension->id()), 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ALLOW_THIS_IN_INITIALIZER_LIST(peer_(new Peer(this))) { 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(erikkay) should we do something for these errors in Release? 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(extension); 4133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(url.SchemeIs(chrome::kExtensionScheme) || 4143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick extension->location() == Extension::COMPONENT); 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notify the ExtensionProcessManager that the view was created. 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionProcessManager* epm = profile()->GetExtensionProcessManager(); 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch epm->RegisterExtensionProcess(extension_id(), 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch render_view_host->process()->id()); 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If the extension has permission to load chrome://favicon/ resources we need 422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // to make sure that the FaviconSource is registered with the 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ChromeURLDataManager. 424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (extension->HasHostPermission(GURL(chrome::kChromeUIFaviconURL))) { 425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconSource* favicon_source = new FaviconSource(profile_); 42672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen profile_->GetChromeURLDataManager()->AddDataSource(favicon_source); 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Update the extension permissions. Doing this each time we create an EFD 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ensures that new processes are informed of permissions for newly installed 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // extensions. 432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen render_view_host->Send(new ExtensionMsg_SetAPIPermissions( 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extension->id(), extension->api_permissions())); 434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen render_view_host->Send(new ExtensionMsg_SetHostPermissions( 435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extension->url(), extension->host_permissions())); 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify( 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::EXTENSION_FUNCTION_DISPATCHER_CREATED, 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<Profile>(profile_), 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Details<ExtensionFunctionDispatcher>(this)); 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExtensionFunctionDispatcher::~ExtensionFunctionDispatcher() { 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch peer_->dispatcher_ = NULL; 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify( 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::EXTENSION_FUNCTION_DISPATCHER_DESTROYED, 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<Profile>(profile_), 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Details<ExtensionFunctionDispatcher>(this)); 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowser* ExtensionFunctionDispatcher::GetCurrentBrowser( 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool include_incognito) { 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Browser* browser = delegate_->GetBrowser(); 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // If the delegate has an associated browser, that is always the right answer. 4573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (browser) 4583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return browser; 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Otherwise, try to default to a reasonable browser. If |include_incognito| 4613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // is true, we will also search browsers in the incognito version of this 4623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // profile. Note that the profile may already be incognito, in which case 4633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // we will search the incognito version only, regardless of the value of 4643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // |include_incognito|. 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile = render_view_host()->process()->profile(); 4663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick browser = BrowserList::FindBrowserWithType(profile, Browser::TYPE_NORMAL, 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch include_incognito); 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NOTE(rafaelw): This can return NULL in some circumstances. In particular, 4703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // a background_page onload chrome.tabs api call can make it into here 4713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // before the browser is sufficiently initialized to return here. 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A similar situation may arise during shutdown. 473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(rafaelw): Delay creation of background_page until the browser 474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is available. http://code.google.com/p/chromium/issues/detail?id=13284 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return browser; 476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid ExtensionFunctionDispatcher::HandleRequest( 479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const ExtensionHostMsg_DomMessage_Params& params) { 480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<ExtensionFunction> function( 48121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FactoryRegistry::GetInstance()->NewFunction(params.name)); 482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch function->set_dispatcher_peer(peer_); 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch function->set_profile(profile_); 484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch function->set_extension_id(extension_id()); 4853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick function->SetArgs(¶ms.arguments); 4863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick function->set_source_url(params.source_url); 4873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick function->set_request_id(params.request_id); 4883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick function->set_has_callback(params.has_callback); 4893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick function->set_user_gesture(params.user_gesture); 49021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ExtensionService* service = profile()->GetExtensionService(); 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(service); 492513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension = service->GetExtensionById(extension_id(), false); 493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(extension); 494513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch function->set_include_incognito(service->CanCrossIncognito(extension)); 4953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!service->ExtensionBindingsAllowed(function->source_url()) || 4973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick !extension->HasApiPermission(function->name())) { 498ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen render_view_host_->Send(new ExtensionMsg_Response( 499ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen render_view_host_->routing_id(), function->request_id(), false, 500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string(), "Access to extension API denied.")); 5013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return; 5023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionsQuotaService* quota = service->quota_service(); 5053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (quota->Assess(extension_id(), function, ¶ms.arguments, 5063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::TimeTicks::Now())) { 5073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // See crbug.com/39178. 5083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ExternalProtocolHandler::PermitLaunchUrl(); 5093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch function->Run(); 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen render_view_host_->Send(new ExtensionMsg_Response( 513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen render_view_host_->routing_id(), function->request_id(), false, 514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string(), QuotaLimitHeuristic::kGenericOverQuotaError)); 515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionFunctionDispatcher::SendResponse(ExtensionFunction* function, 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool success) { 520ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen render_view_host_->Send(new ExtensionMsg_Response( 521ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen render_view_host_->routing_id(), function->request_id(), success, 522ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen function->GetResult(), function->GetError())); 523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExtensionFunctionDispatcher::HandleBadMessage(ExtensionFunction* api) { 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(ERROR) << "bad extension message " << 527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch api->name() << 528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch " : terminating renderer."; 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (RenderProcessHost::run_renderer_in_process()) { 530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // In single process mode it is better if we don't suicide but just crash. 531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CHECK(false); 532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 53421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_EFD")); 535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::KillProcess(render_view_host_->process()->GetHandle(), 536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResultCodes::KILLED_BAD_MESSAGE, false); 537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochProfile* ExtensionFunctionDispatcher::profile() { 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return profile_; 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 543