| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "extensions/renderer/native_extension_bindings_system.h" | 5 #include "extensions/renderer/native_extension_bindings_system.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/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "content/public/common/console_message_level.h" | 10 #include "content/public/common/console_message_level.h" |
| (...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 740 params->service_worker_version_id = kInvalidServiceWorkerVersionId; | 740 params->service_worker_version_id = kInvalidServiceWorkerVersionId; |
| 741 | 741 |
| 742 ipc_message_sender_->SendRequestIPC(script_context, std::move(params), | 742 ipc_message_sender_->SendRequestIPC(script_context, std::move(params), |
| 743 request->thread); | 743 request->thread); |
| 744 } | 744 } |
| 745 | 745 |
| 746 void NativeExtensionBindingsSystem::OnEventListenerChanged( | 746 void NativeExtensionBindingsSystem::OnEventListenerChanged( |
| 747 const std::string& event_name, | 747 const std::string& event_name, |
| 748 binding::EventListenersChanged change, | 748 binding::EventListenersChanged change, |
| 749 const base::DictionaryValue* filter, | 749 const base::DictionaryValue* filter, |
| 750 bool was_manual, | 750 bool update_lazy_listeners, |
| 751 v8::Local<v8::Context> context) { | 751 v8::Local<v8::Context> context) { |
| 752 ScriptContext* script_context = | 752 ScriptContext* script_context = |
| 753 ScriptContextSet::GetContextByV8Context(context); | 753 ScriptContextSet::GetContextByV8Context(context); |
| 754 // Note: Check context_type() first to avoid accessing ExtensionFrameHelper on | 754 // Note: Check context_type() first to avoid accessing ExtensionFrameHelper on |
| 755 // a worker thread. | 755 // a worker thread. |
| 756 bool is_lazy = | 756 bool is_lazy = |
| 757 script_context->context_type() == Feature::SERVICE_WORKER_CONTEXT || | 757 update_lazy_listeners && |
| 758 ExtensionFrameHelper::IsContextForEventPage(script_context); | 758 (script_context->context_type() == Feature::SERVICE_WORKER_CONTEXT || |
| 759 ExtensionFrameHelper::IsContextForEventPage(script_context)); |
| 759 // We only remove a lazy listener if the listener removal was triggered | 760 // We only remove a lazy listener if the listener removal was triggered |
| 760 // manually by the extension. | 761 // manually by the extension. |
| 761 bool remove_lazy_listener = is_lazy && was_manual; | |
| 762 | 762 |
| 763 if (filter) { // Filtered event listeners. | 763 if (filter) { // Filtered event listeners. |
| 764 DCHECK(filter); | 764 DCHECK(filter); |
| 765 if (change == binding::EventListenersChanged::HAS_LISTENERS) { | 765 if (change == binding::EventListenersChanged::HAS_LISTENERS) { |
| 766 ipc_message_sender_->SendAddFilteredEventListenerIPC( | 766 ipc_message_sender_->SendAddFilteredEventListenerIPC( |
| 767 script_context, event_name, *filter, is_lazy); | 767 script_context, event_name, *filter, is_lazy); |
| 768 } else { | 768 } else { |
| 769 DCHECK_EQ(binding::EventListenersChanged::NO_LISTENERS, change); | 769 DCHECK_EQ(binding::EventListenersChanged::NO_LISTENERS, change); |
| 770 ipc_message_sender_->SendRemoveFilteredEventListenerIPC( | 770 ipc_message_sender_->SendRemoveFilteredEventListenerIPC( |
| 771 script_context, event_name, *filter, remove_lazy_listener); | 771 script_context, event_name, *filter, is_lazy); |
| 772 } | 772 } |
| 773 } else { // Unfiltered event listeners. | 773 } else { // Unfiltered event listeners. |
| 774 if (change == binding::EventListenersChanged::HAS_LISTENERS) { | 774 if (change == binding::EventListenersChanged::HAS_LISTENERS) { |
| 775 // TODO(devlin): The JS bindings code only adds one listener per extension | 775 // TODO(devlin): The JS bindings code only adds one listener per extension |
| 776 // per event per process, whereas this is one listener per context per | 776 // per event per process, whereas this is one listener per context per |
| 777 // event per process. Typically, this won't make a difference, but it | 777 // event per process. Typically, this won't make a difference, but it |
| 778 // could if there are multiple contexts for the same extension (e.g., | 778 // could if there are multiple contexts for the same extension (e.g., |
| 779 // multiple frames). In that case, it would result in extra IPCs being | 779 // multiple frames). In that case, it would result in extra IPCs being |
| 780 // sent. I'm not sure it's a big enough deal to warrant refactoring. | 780 // sent. I'm not sure it's a big enough deal to warrant refactoring. |
| 781 ipc_message_sender_->SendAddUnfilteredEventListenerIPC(script_context, | 781 ipc_message_sender_->SendAddUnfilteredEventListenerIPC(script_context, |
| 782 event_name); | 782 event_name); |
| 783 if (is_lazy) { | 783 if (is_lazy) { |
| 784 ipc_message_sender_->SendAddUnfilteredLazyEventListenerIPC( | 784 ipc_message_sender_->SendAddUnfilteredLazyEventListenerIPC( |
| 785 script_context, event_name); | 785 script_context, event_name); |
| 786 } | 786 } |
| 787 } else { | 787 } else { |
| 788 DCHECK_EQ(binding::EventListenersChanged::NO_LISTENERS, change); | 788 DCHECK_EQ(binding::EventListenersChanged::NO_LISTENERS, change); |
| 789 ipc_message_sender_->SendRemoveUnfilteredEventListenerIPC(script_context, | 789 ipc_message_sender_->SendRemoveUnfilteredEventListenerIPC(script_context, |
| 790 event_name); | 790 event_name); |
| 791 if (remove_lazy_listener) { | 791 if (is_lazy) { |
| 792 ipc_message_sender_->SendRemoveUnfilteredLazyEventListenerIPC( | 792 ipc_message_sender_->SendRemoveUnfilteredLazyEventListenerIPC( |
| 793 script_context, event_name); | 793 script_context, event_name); |
| 794 } | 794 } |
| 795 } | 795 } |
| 796 } | 796 } |
| 797 } | 797 } |
| 798 | 798 |
| 799 void NativeExtensionBindingsSystem::GetJSBindingUtil( | 799 void NativeExtensionBindingsSystem::GetJSBindingUtil( |
| 800 v8::Local<v8::Context> context, | 800 v8::Local<v8::Context> context, |
| 801 v8::Local<v8::Value>* binding_util_out) { | 801 v8::Local<v8::Value>* binding_util_out) { |
| 802 gin::Handle<APIBindingJSUtil> handle = gin::CreateHandle( | 802 gin::Handle<APIBindingJSUtil> handle = gin::CreateHandle( |
| 803 context->GetIsolate(), | 803 context->GetIsolate(), |
| 804 new APIBindingJSUtil( | 804 new APIBindingJSUtil( |
| 805 api_system_.type_reference_map(), api_system_.request_handler(), | 805 api_system_.type_reference_map(), api_system_.request_handler(), |
| 806 api_system_.event_handler(), api_system_.exception_handler(), | 806 api_system_.event_handler(), api_system_.exception_handler(), |
| 807 base::Bind(&CallJsFunction))); | 807 base::Bind(&CallJsFunction))); |
| 808 *binding_util_out = handle.ToV8(); | 808 *binding_util_out = handle.ToV8(); |
| 809 } | 809 } |
| 810 | 810 |
| 811 } // namespace extensions | 811 } // namespace extensions |
| OLD | NEW |