Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(486)

Side by Side Diff: extensions/renderer/native_extension_bindings_system.cc

Issue 2973903002: [Extensions Bindings] Introduce a supportsLazyListeners property (Closed)
Patch Set: onMessage event fix Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW
« no previous file with comments | « extensions/renderer/event_bindings.cc ('k') | extensions/renderer/resources/app_window_custom_bindings.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698