| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "chrome/renderer/extensions/extension_dispatcher.h" | 5 #include "chrome/renderer/extensions/extension_dispatcher.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/string_piece.h" | 10 #include "base/string_piece.h" |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 #include "chrome/renderer/extensions/extension_request_sender.h" | 33 #include "chrome/renderer/extensions/extension_request_sender.h" |
| 34 #include "chrome/renderer/extensions/file_browser_handler_custom_bindings.h" | 34 #include "chrome/renderer/extensions/file_browser_handler_custom_bindings.h" |
| 35 #include "chrome/renderer/extensions/file_browser_private_custom_bindings.h" | 35 #include "chrome/renderer/extensions/file_browser_private_custom_bindings.h" |
| 36 #include "chrome/renderer/extensions/i18n_custom_bindings.h" | 36 #include "chrome/renderer/extensions/i18n_custom_bindings.h" |
| 37 #include "chrome/renderer/extensions/media_gallery_custom_bindings.h" | 37 #include "chrome/renderer/extensions/media_gallery_custom_bindings.h" |
| 38 #include "chrome/renderer/extensions/miscellaneous_bindings.h" | 38 #include "chrome/renderer/extensions/miscellaneous_bindings.h" |
| 39 #include "chrome/renderer/extensions/page_actions_custom_bindings.h" | 39 #include "chrome/renderer/extensions/page_actions_custom_bindings.h" |
| 40 #include "chrome/renderer/extensions/page_capture_custom_bindings.h" | 40 #include "chrome/renderer/extensions/page_capture_custom_bindings.h" |
| 41 #include "chrome/renderer/extensions/send_request_natives.h" | 41 #include "chrome/renderer/extensions/send_request_natives.h" |
| 42 #include "chrome/renderer/extensions/set_icon_natives.h" | 42 #include "chrome/renderer/extensions/set_icon_natives.h" |
| 43 #include "chrome/renderer/extensions/tab_finder.h" |
| 43 #include "chrome/renderer/extensions/tabs_custom_bindings.h" | 44 #include "chrome/renderer/extensions/tabs_custom_bindings.h" |
| 44 #include "chrome/renderer/extensions/tts_custom_bindings.h" | 45 #include "chrome/renderer/extensions/tts_custom_bindings.h" |
| 45 #include "chrome/renderer/extensions/user_script_slave.h" | 46 #include "chrome/renderer/extensions/user_script_slave.h" |
| 46 #include "chrome/renderer/extensions/web_request_custom_bindings.h" | 47 #include "chrome/renderer/extensions/web_request_custom_bindings.h" |
| 47 #include "chrome/renderer/extensions/webstore_bindings.h" | 48 #include "chrome/renderer/extensions/webstore_bindings.h" |
| 48 #include "chrome/renderer/module_system.h" | 49 #include "chrome/renderer/module_system.h" |
| 49 #include "chrome/renderer/native_handler.h" | 50 #include "chrome/renderer/native_handler.h" |
| 50 #include "chrome/renderer/resource_bundle_source_map.h" | 51 #include "chrome/renderer/resource_bundle_source_map.h" |
| 51 #include "content/public/renderer/render_thread.h" | 52 #include "content/public/renderer/render_thread.h" |
| 52 #include "content/public/renderer/render_view.h" | 53 #include "content/public/renderer/render_view.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 65 | 66 |
| 66 using WebKit::WebDataSource; | 67 using WebKit::WebDataSource; |
| 67 using WebKit::WebDocument; | 68 using WebKit::WebDocument; |
| 68 using WebKit::WebFrame; | 69 using WebKit::WebFrame; |
| 69 using WebKit::WebScopedUserGesture; | 70 using WebKit::WebScopedUserGesture; |
| 70 using WebKit::WebSecurityPolicy; | 71 using WebKit::WebSecurityPolicy; |
| 71 using WebKit::WebString; | 72 using WebKit::WebString; |
| 72 using WebKit::WebVector; | 73 using WebKit::WebVector; |
| 73 using WebKit::WebView; | 74 using WebKit::WebView; |
| 74 using content::RenderThread; | 75 using content::RenderThread; |
| 76 using content::RenderView; |
| 75 using extensions::ApiDefinitionsNatives; | 77 using extensions::ApiDefinitionsNatives; |
| 76 using extensions::AppWindowCustomBindings; | 78 using extensions::AppWindowCustomBindings; |
| 77 using extensions::ContextMenusCustomBindings; | 79 using extensions::ContextMenusCustomBindings; |
| 78 using extensions::Extension; | 80 using extensions::Extension; |
| 79 using extensions::ExperimentalAppCustomBindings; | 81 using extensions::ExperimentalAppCustomBindings; |
| 80 using extensions::ExperimentalUsbCustomBindings; | 82 using extensions::ExperimentalUsbCustomBindings; |
| 81 using extensions::ExtensionAPI; | 83 using extensions::ExtensionAPI; |
| 82 using extensions::ExtensionCustomBindings; | 84 using extensions::ExtensionCustomBindings; |
| 83 using extensions::Feature; | 85 using extensions::Feature; |
| 84 using extensions::FileBrowserHandlerCustomBindings; | 86 using extensions::FileBrowserHandlerCustomBindings; |
| 85 using extensions::FileBrowserPrivateCustomBindings; | 87 using extensions::FileBrowserPrivateCustomBindings; |
| 86 using extensions::I18NCustomBindings; | 88 using extensions::I18NCustomBindings; |
| 87 using extensions::MiscellaneousBindings; | 89 using extensions::MiscellaneousBindings; |
| 88 using extensions::MediaGalleryCustomBindings; | 90 using extensions::MediaGalleryCustomBindings; |
| 89 using extensions::PageActionsCustomBindings; | 91 using extensions::PageActionsCustomBindings; |
| 90 using extensions::PageCaptureCustomBindings; | 92 using extensions::PageCaptureCustomBindings; |
| 91 using extensions::SendRequestNatives; | 93 using extensions::SendRequestNatives; |
| 92 using extensions::SetIconNatives; | 94 using extensions::SetIconNatives; |
| 93 using extensions::TTSCustomBindings; | 95 using extensions::TTSCustomBindings; |
| 96 using extensions::TabFinder; |
| 94 using extensions::TabsCustomBindings; | 97 using extensions::TabsCustomBindings; |
| 95 using extensions::UpdatedExtensionPermissionsInfo; | 98 using extensions::UpdatedExtensionPermissionsInfo; |
| 96 using extensions::WebRequestCustomBindings; | 99 using extensions::WebRequestCustomBindings; |
| 97 | 100 |
| 98 namespace { | 101 namespace { |
| 99 | 102 |
| 100 static const int64 kInitialExtensionIdleHandlerDelayMs = 5*1000; | 103 static const int64 kInitialExtensionIdleHandlerDelayMs = 5*1000; |
| 101 static const int64 kMaxExtensionIdleHandlerDelayMs = 5*60*1000; | 104 static const int64 kMaxExtensionIdleHandlerDelayMs = 5*60*1000; |
| 102 static const char kEventDispatchFunction[] = "Event.dispatchJSON"; | 105 static const char kEventDispatchFunction[] = "Event.dispatchJSON"; |
| 103 static const char kOnUnloadEvent[] = "runtime.onBackgroundPageUnloadingSoon"; | 106 static const char kOnUnloadEvent[] = "runtime.onBackgroundPageUnloadingSoon"; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 RouteFunction("DecrementKeepaliveCount", | 149 RouteFunction("DecrementKeepaliveCount", |
| 147 base::Bind(&LazyBackgroundPageNativeHandler::DecrementKeepaliveCount, | 150 base::Bind(&LazyBackgroundPageNativeHandler::DecrementKeepaliveCount, |
| 148 base::Unretained(this))); | 151 base::Unretained(this))); |
| 149 } | 152 } |
| 150 | 153 |
| 151 v8::Handle<v8::Value> IncrementKeepaliveCount(const v8::Arguments& args) { | 154 v8::Handle<v8::Value> IncrementKeepaliveCount(const v8::Arguments& args) { |
| 152 ChromeV8Context* context = | 155 ChromeV8Context* context = |
| 153 extension_dispatcher()->v8_context_set().GetCurrent(); | 156 extension_dispatcher()->v8_context_set().GetCurrent(); |
| 154 if (!context) | 157 if (!context) |
| 155 return v8::Undefined(); | 158 return v8::Undefined(); |
| 156 content::RenderView* render_view = context->GetRenderView(); | 159 RenderView* render_view = context->GetRenderView(); |
| 157 if (IsContextLazyBackgroundPage(render_view, context->extension())) { | 160 if (IsContextLazyBackgroundPage(render_view, context->extension())) { |
| 158 render_view->Send(new ExtensionHostMsg_IncrementLazyKeepaliveCount( | 161 render_view->Send(new ExtensionHostMsg_IncrementLazyKeepaliveCount( |
| 159 render_view->GetRoutingID())); | 162 render_view->GetRoutingID())); |
| 160 } | 163 } |
| 161 return v8::Undefined(); | 164 return v8::Undefined(); |
| 162 } | 165 } |
| 163 | 166 |
| 164 v8::Handle<v8::Value> DecrementKeepaliveCount(const v8::Arguments& args) { | 167 v8::Handle<v8::Value> DecrementKeepaliveCount(const v8::Arguments& args) { |
| 165 ChromeV8Context* context = | 168 ChromeV8Context* context = |
| 166 extension_dispatcher()->v8_context_set().GetCurrent(); | 169 extension_dispatcher()->v8_context_set().GetCurrent(); |
| 167 if (!context) | 170 if (!context) |
| 168 return v8::Undefined(); | 171 return v8::Undefined(); |
| 169 content::RenderView* render_view = context->GetRenderView(); | 172 RenderView* render_view = context->GetRenderView(); |
| 170 if (IsContextLazyBackgroundPage(render_view, context->extension())) { | 173 if (IsContextLazyBackgroundPage(render_view, context->extension())) { |
| 171 render_view->Send(new ExtensionHostMsg_DecrementLazyKeepaliveCount( | 174 render_view->Send(new ExtensionHostMsg_DecrementLazyKeepaliveCount( |
| 172 render_view->GetRoutingID())); | 175 render_view->GetRoutingID())); |
| 173 } | 176 } |
| 174 return v8::Undefined(); | 177 return v8::Undefined(); |
| 175 } | 178 } |
| 176 | 179 |
| 177 private: | 180 private: |
| 178 bool IsContextLazyBackgroundPage(content::RenderView* render_view, | 181 bool IsContextLazyBackgroundPage(RenderView* render_view, |
| 179 const Extension* extension) { | 182 const Extension* extension) { |
| 180 if (!render_view) | 183 if (!render_view) |
| 181 return false; | 184 return false; |
| 182 | 185 |
| 183 ExtensionHelper* helper = ExtensionHelper::Get(render_view); | 186 ExtensionHelper* helper = ExtensionHelper::Get(render_view); |
| 184 return (extension && extension->has_lazy_background_page() && | 187 return (extension && extension->has_lazy_background_page() && |
| 185 helper->view_type() == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); | 188 helper->view_type() == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); |
| 186 } | 189 } |
| 187 }; | 190 }; |
| 188 | 191 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 IPC_MESSAGE_HANDLER(ExtensionMsg_DeliverMessage, OnDeliverMessage) | 261 IPC_MESSAGE_HANDLER(ExtensionMsg_DeliverMessage, OnDeliverMessage) |
| 259 IPC_MESSAGE_HANDLER(ExtensionMsg_DispatchOnDisconnect, | 262 IPC_MESSAGE_HANDLER(ExtensionMsg_DispatchOnDisconnect, |
| 260 OnDispatchOnDisconnect) | 263 OnDispatchOnDisconnect) |
| 261 IPC_MESSAGE_HANDLER(ExtensionMsg_SetFunctionNames, OnSetFunctionNames) | 264 IPC_MESSAGE_HANDLER(ExtensionMsg_SetFunctionNames, OnSetFunctionNames) |
| 262 IPC_MESSAGE_HANDLER(ExtensionMsg_Loaded, OnLoaded) | 265 IPC_MESSAGE_HANDLER(ExtensionMsg_Loaded, OnLoaded) |
| 263 IPC_MESSAGE_HANDLER(ExtensionMsg_Unloaded, OnUnloaded) | 266 IPC_MESSAGE_HANDLER(ExtensionMsg_Unloaded, OnUnloaded) |
| 264 IPC_MESSAGE_HANDLER(ExtensionMsg_SetScriptingWhitelist, | 267 IPC_MESSAGE_HANDLER(ExtensionMsg_SetScriptingWhitelist, |
| 265 OnSetScriptingWhitelist) | 268 OnSetScriptingWhitelist) |
| 266 IPC_MESSAGE_HANDLER(ExtensionMsg_ActivateExtension, OnActivateExtension) | 269 IPC_MESSAGE_HANDLER(ExtensionMsg_ActivateExtension, OnActivateExtension) |
| 267 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdatePermissions, OnUpdatePermissions) | 270 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdatePermissions, OnUpdatePermissions) |
| 271 IPC_MESSAGE_HANDLER(ExtensionMsg_SetTabSpecificPermissions, |
| 272 OnSetTabSpecificPermissions) |
| 273 IPC_MESSAGE_HANDLER(ExtensionMsg_ClearTabSpecificPermissions, |
| 274 OnClearTabSpecificPermissions) |
| 268 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdateUserScripts, OnUpdateUserScripts) | 275 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdateUserScripts, OnUpdateUserScripts) |
| 269 IPC_MESSAGE_HANDLER(ExtensionMsg_UsingWebRequestAPI, OnUsingWebRequestAPI) | 276 IPC_MESSAGE_HANDLER(ExtensionMsg_UsingWebRequestAPI, OnUsingWebRequestAPI) |
| 270 IPC_MESSAGE_HANDLER(ExtensionMsg_ShouldUnload, OnShouldUnload) | 277 IPC_MESSAGE_HANDLER(ExtensionMsg_ShouldUnload, OnShouldUnload) |
| 271 IPC_MESSAGE_HANDLER(ExtensionMsg_Unload, OnUnload) | 278 IPC_MESSAGE_HANDLER(ExtensionMsg_Unload, OnUnload) |
| 272 IPC_MESSAGE_UNHANDLED(handled = false) | 279 IPC_MESSAGE_UNHANDLED(handled = false) |
| 273 IPC_END_MESSAGE_MAP() | 280 IPC_END_MESSAGE_MAP() |
| 274 | 281 |
| 275 return handled; | 282 return handled; |
| 276 } | 283 } |
| 277 | 284 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 if (is_extension_process_) { | 346 if (is_extension_process_) { |
| 340 RenderThread::Get()->ScheduleIdleHandler( | 347 RenderThread::Get()->ScheduleIdleHandler( |
| 341 kInitialExtensionIdleHandlerDelayMs); | 348 kInitialExtensionIdleHandlerDelayMs); |
| 342 } | 349 } |
| 343 | 350 |
| 344 // Tell the browser process when an event has been dispatched with a lazy | 351 // Tell the browser process when an event has been dispatched with a lazy |
| 345 // background page active. | 352 // background page active. |
| 346 const Extension* extension = extensions_.GetByID(extension_id); | 353 const Extension* extension = extensions_.GetByID(extension_id); |
| 347 if (extension && extension->has_lazy_background_page() && | 354 if (extension && extension->has_lazy_background_page() && |
| 348 function_name == kEventDispatchFunction) { | 355 function_name == kEventDispatchFunction) { |
| 349 content::RenderView* background_view = | 356 RenderView* background_view = |
| 350 ExtensionHelper::GetBackgroundPage(extension_id); | 357 ExtensionHelper::GetBackgroundPage(extension_id); |
| 351 if (background_view) { | 358 if (background_view) { |
| 352 background_view->Send(new ExtensionHostMsg_EventAck( | 359 background_view->Send(new ExtensionHostMsg_EventAck( |
| 353 background_view->GetRoutingID())); | 360 background_view->GetRoutingID())); |
| 354 } | 361 } |
| 355 } | 362 } |
| 356 } | 363 } |
| 357 | 364 |
| 358 void ExtensionDispatcher::OnDispatchOnConnect( | 365 void ExtensionDispatcher::OnDispatchOnConnect( |
| 359 int target_port_id, | 366 int target_port_id, |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 // whitelist entries need to be updated when the kManagement permission | 776 // whitelist entries need to be updated when the kManagement permission |
| 770 // changes. | 777 // changes. |
| 771 if (extension->HasAPIPermission(ExtensionAPIPermission::kManagement)) { | 778 if (extension->HasAPIPermission(ExtensionAPIPermission::kManagement)) { |
| 772 WebSecurityPolicy::addOriginAccessWhitelistEntry( | 779 WebSecurityPolicy::addOriginAccessWhitelistEntry( |
| 773 extension->url(), | 780 extension->url(), |
| 774 WebString::fromUTF8(chrome::kChromeUIScheme), | 781 WebString::fromUTF8(chrome::kChromeUIScheme), |
| 775 WebString::fromUTF8(chrome::kChromeUIExtensionIconHost), | 782 WebString::fromUTF8(chrome::kChromeUIExtensionIconHost), |
| 776 false); | 783 false); |
| 777 } | 784 } |
| 778 | 785 |
| 779 UpdateOriginPermissions(UpdatedExtensionPermissionsInfo::ADDED, | 786 AddOrRemoveOriginPermissions( |
| 780 extension, | 787 UpdatedExtensionPermissionsInfo::ADDED, |
| 781 extension->GetActivePermissions()->explicit_hosts()); | 788 extension, |
| 789 *extension->GetActiveHostPermissionsForAllTabs()); |
| 782 } | 790 } |
| 783 | 791 |
| 784 void ExtensionDispatcher::UpdateOriginPermissions( | 792 void ExtensionDispatcher::AddOrRemoveOriginPermissions( |
| 785 UpdatedExtensionPermissionsInfo::Reason reason, | 793 UpdatedExtensionPermissionsInfo::Reason reason, |
| 786 const Extension* extension, | 794 const Extension* extension, |
| 787 const URLPatternSet& origins) { | 795 const URLPatternSet& origins) { |
| 788 for (URLPatternSet::const_iterator i = origins.begin(); | 796 for (URLPatternSet::const_iterator i = origins.begin(); |
| 789 i != origins.end(); ++i) { | 797 i != origins.end(); ++i) { |
| 790 const char* schemes[] = { | 798 const char* schemes[] = { |
| 791 chrome::kHttpScheme, | 799 chrome::kHttpScheme, |
| 792 chrome::kHttpsScheme, | 800 chrome::kHttpsScheme, |
| 793 chrome::kFileScheme, | 801 chrome::kFileScheme, |
| 794 chrome::kChromeUIScheme, | 802 chrome::kChromeUIScheme, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 810 void ExtensionDispatcher::OnUpdatePermissions( | 818 void ExtensionDispatcher::OnUpdatePermissions( |
| 811 int reason_id, | 819 int reason_id, |
| 812 const std::string& extension_id, | 820 const std::string& extension_id, |
| 813 const ExtensionAPIPermissionSet& apis, | 821 const ExtensionAPIPermissionSet& apis, |
| 814 const URLPatternSet& explicit_hosts, | 822 const URLPatternSet& explicit_hosts, |
| 815 const URLPatternSet& scriptable_hosts) { | 823 const URLPatternSet& scriptable_hosts) { |
| 816 const Extension* extension = extensions_.GetByID(extension_id); | 824 const Extension* extension = extensions_.GetByID(extension_id); |
| 817 if (!extension) | 825 if (!extension) |
| 818 return; | 826 return; |
| 819 | 827 |
| 828 // General permissions. |
| 820 scoped_refptr<const ExtensionPermissionSet> delta = | 829 scoped_refptr<const ExtensionPermissionSet> delta = |
| 821 new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts); | 830 new ExtensionPermissionSet(apis, explicit_hosts, scriptable_hosts); |
| 822 scoped_refptr<const ExtensionPermissionSet> old_active = | 831 scoped_refptr<const ExtensionPermissionSet> old_active = |
| 823 extension->GetActivePermissions(); | 832 extension->GetActivePermissions(); |
| 824 UpdatedExtensionPermissionsInfo::Reason reason = | 833 UpdatedExtensionPermissionsInfo::Reason reason = |
| 825 static_cast<UpdatedExtensionPermissionsInfo::Reason>(reason_id); | 834 static_cast<UpdatedExtensionPermissionsInfo::Reason>(reason_id); |
| 826 | 835 |
| 827 const ExtensionPermissionSet* new_active = NULL; | 836 const ExtensionPermissionSet* new_active = NULL; |
| 828 if (reason == UpdatedExtensionPermissionsInfo::ADDED) { | 837 switch (reason) { |
| 829 new_active = ExtensionPermissionSet::CreateUnion(old_active, delta); | 838 case UpdatedExtensionPermissionsInfo::ADDED: |
| 830 } else { | 839 new_active = ExtensionPermissionSet::CreateUnion(old_active, delta); |
| 831 CHECK_EQ(UpdatedExtensionPermissionsInfo::REMOVED, reason); | 840 break; |
| 832 new_active = ExtensionPermissionSet::CreateDifference(old_active, delta); | 841 case UpdatedExtensionPermissionsInfo::REMOVED: |
| 842 new_active = ExtensionPermissionSet::CreateDifference(old_active, delta); |
| 843 break; |
| 833 } | 844 } |
| 834 | 845 |
| 846 URLPatternSet active_hosts_before = |
| 847 *extension->GetActiveHostPermissionsForAllTabs(); |
| 848 |
| 835 extension->SetActivePermissions(new_active); | 849 extension->SetActivePermissions(new_active); |
| 836 UpdateOriginPermissions(reason, extension, explicit_hosts); | 850 |
| 851 // Host permissions. These are different from the general permissions because |
| 852 // they need to take into account the additional host permissions granted via |
| 853 // the activeTab permission for various tabs. |
| 854 URLPatternSet added_or_removed; |
| 855 switch (reason) { |
| 856 case UpdatedExtensionPermissionsInfo::ADDED: |
| 857 URLPatternSet::CreateDifference( |
| 858 *extension->GetActiveHostPermissionsForAllTabs(), |
| 859 active_hosts_before, |
| 860 &added_or_removed); |
| 861 break; |
| 862 case UpdatedExtensionPermissionsInfo::REMOVED: |
| 863 URLPatternSet::CreateDifference( |
| 864 active_hosts_before, |
| 865 *extension->GetActiveHostPermissionsForAllTabs(), |
| 866 &added_or_removed); |
| 867 break; |
| 868 } |
| 869 |
| 870 AddOrRemoveOriginPermissions(reason, extension, added_or_removed); |
| 871 } |
| 872 |
| 873 void ExtensionDispatcher::OnSetTabSpecificPermissions( |
| 874 int page_id, |
| 875 int tab_id, |
| 876 const std::string& extension_id, |
| 877 const URLPatternSet& origin_set) { |
| 878 // If this renderer contains the target tab then check against page_id to |
| 879 // avoid race conditions. The target tab is a more sensitive target since it |
| 880 // has the opportunity to block executeScript calls. It would be nice to also |
| 881 // check it on other renderers, but this obviously isn't possible. |
| 882 RenderView* view = TabFinder::Find(tab_id); |
| 883 if (view && view->GetPageId() != page_id) { |
| 884 LOG(WARNING) << |
| 885 "Wrong page ID, wanted " << page_id << " but was " << view->GetPageId(); |
| 886 return; |
| 887 } |
| 888 |
| 889 const Extension* extension = extensions_.GetByID(extension_id); |
| 890 if (!extension) |
| 891 return; |
| 892 |
| 893 URLPatternSet before = *extension->GetActiveHostPermissionsForAllTabs(); |
| 894 |
| 895 extension->SetTabSpecificHostPermissions(tab_id, origin_set); |
| 896 |
| 897 // The origin permissions for XHR include the the union of host permissions |
| 898 // for all tabs, granted via the activeTab permission. |
| 899 URLPatternSet added; |
| 900 URLPatternSet::CreateDifference( |
| 901 *extension->GetActiveHostPermissionsForAllTabs(), |
| 902 before, |
| 903 &added); |
| 904 AddOrRemoveOriginPermissions(UpdatedExtensionPermissionsInfo::ADDED, |
| 905 extension, |
| 906 added); |
| 907 } |
| 908 |
| 909 void ExtensionDispatcher::OnClearTabSpecificPermissions( |
| 910 int tab_id, |
| 911 const std::vector<std::string>& extension_ids) { |
| 912 for (std::vector<std::string>::const_iterator it = extension_ids.begin(); |
| 913 it != extension_ids.end(); ++it) { |
| 914 const Extension* extension = extensions_.GetByID(*it); |
| 915 if (!extension) |
| 916 continue; |
| 917 |
| 918 URLPatternSet before = *extension->GetActiveHostPermissionsForAllTabs(); |
| 919 |
| 920 extension->ClearTabSpecificHostPermissions(tab_id); |
| 921 |
| 922 // The origin permissions for XHR include the the union of host permissions |
| 923 // for all tabs, granted via the activeTab permission. |
| 924 URLPatternSet removed; |
| 925 URLPatternSet::CreateDifference( |
| 926 before, |
| 927 *extension->GetActiveHostPermissionsForAllTabs(), |
| 928 &removed); |
| 929 AddOrRemoveOriginPermissions(UpdatedExtensionPermissionsInfo::REMOVED, |
| 930 extension, |
| 931 removed); |
| 932 } |
| 837 } | 933 } |
| 838 | 934 |
| 839 void ExtensionDispatcher::OnUpdateUserScripts( | 935 void ExtensionDispatcher::OnUpdateUserScripts( |
| 840 base::SharedMemoryHandle scripts) { | 936 base::SharedMemoryHandle scripts) { |
| 841 DCHECK(base::SharedMemory::IsHandleValid(scripts)) << "Bad scripts handle"; | 937 DCHECK(base::SharedMemory::IsHandleValid(scripts)) << "Bad scripts handle"; |
| 842 user_script_slave_->UpdateScripts(scripts); | 938 user_script_slave_->UpdateScripts(scripts); |
| 843 UpdateActiveExtensions(); | 939 UpdateActiveExtensions(); |
| 844 } | 940 } |
| 845 | 941 |
| 846 void ExtensionDispatcher::UpdateActiveExtensions() { | 942 void ExtensionDispatcher::UpdateActiveExtensions() { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 939 static const char kMessage[] = | 1035 static const char kMessage[] = |
| 940 "%s can only be used in an extension process."; | 1036 "%s can only be used in an extension process."; |
| 941 std::string error_msg = base::StringPrintf(kMessage, function_name.c_str()); | 1037 std::string error_msg = base::StringPrintf(kMessage, function_name.c_str()); |
| 942 v8::ThrowException( | 1038 v8::ThrowException( |
| 943 v8::Exception::Error(v8::String::New(error_msg.c_str()))); | 1039 v8::Exception::Error(v8::String::New(error_msg.c_str()))); |
| 944 return false; | 1040 return false; |
| 945 } | 1041 } |
| 946 | 1042 |
| 947 return true; | 1043 return true; |
| 948 } | 1044 } |
| OLD | NEW |