Index: extensions/renderer/api_binding.cc |
diff --git a/extensions/renderer/api_binding.cc b/extensions/renderer/api_binding.cc |
index fa54becf4b2d77e4ba761c85de11810da3c4af46..02c0102058b87b7975190472e3aa9066947de31a 100644 |
--- a/extensions/renderer/api_binding.cc |
+++ b/extensions/renderer/api_binding.cc |
@@ -10,6 +10,7 @@ |
#include "base/strings/stringprintf.h" |
#include "base/values.h" |
#include "extensions/common/extension_api.h" |
+#include "extensions/renderer/api_event_handler.h" |
#include "extensions/renderer/v8_helpers.h" |
#include "gin/arguments.h" |
#include "gin/per_context_data.h" |
@@ -163,6 +164,7 @@ APIBinding::APIPerContextData::~APIPerContextData() {} |
APIBinding::APIBinding(const std::string& api_name, |
const base::ListValue& function_definitions, |
const base::ListValue* type_definitions, |
+ const base::ListValue* event_definitions, |
const APIMethodCallback& callback, |
ArgumentSpec::RefMap* type_refs) |
: api_name_(api_name), |
@@ -190,6 +192,16 @@ APIBinding::APIBinding(const std::string& api_name, |
(*type_refs)[id] = base::MakeUnique<ArgumentSpec>(*type_dict); |
} |
} |
+ if (event_definitions) { |
+ event_names_.reserve(event_definitions->GetSize()); |
+ for (const auto& event : *event_definitions) { |
+ const base::DictionaryValue* event_dict = nullptr; |
+ CHECK(event->GetAsDictionary(&event_dict)); |
+ std::string name; |
+ CHECK(event_dict->GetString("name", &name)); |
+ event_names_.push_back(std::move(name)); |
+ } |
+ } |
} |
APIBinding::~APIBinding() {} |
@@ -197,6 +209,7 @@ APIBinding::~APIBinding() {} |
v8::Local<v8::Object> APIBinding::CreateInstance( |
v8::Local<v8::Context> context, |
v8::Isolate* isolate, |
+ APIEventHandler* event_handler, |
const AvailabilityCallback& is_available) { |
// TODO(devlin): APIs may change depending on which features are available, |
// but we should be able to cache the unconditional methods on an object |
@@ -236,6 +249,18 @@ v8::Local<v8::Object> APIBinding::CreateInstance( |
DCHECK(success.FromJust()); |
} |
+ for (const std::string& event_name : event_names_) { |
+ std::string full_event_name = |
+ base::StringPrintf("%s.%s", api_name_.c_str(), event_name.c_str()); |
+ v8::Local<v8::Object> event = |
+ event_handler->CreateEventInstance(full_event_name, context); |
+ DCHECK(!event.IsEmpty()); |
+ v8::Maybe<bool> success = object->CreateDataProperty( |
+ context, gin::StringToSymbol(isolate, event_name), event); |
+ DCHECK(success.IsJust()); |
+ DCHECK(success.FromJust()); |
+ } |
+ |
return object; |
} |