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 |