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

Unified Diff: extensions/renderer/api_binding.cc

Issue 2469593002: [Extensions Bindings] Add Events support (Closed)
Patch Set: . Created 4 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: extensions/renderer/api_binding.cc
diff --git a/extensions/renderer/api_binding.cc b/extensions/renderer/api_binding.cc
index 2a8335bfa6049c821213a2842498d4d3a8d09529..be70c9b5107590ac6e16afcdb241b41d475d2e85 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,12 +192,24 @@ 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() {}
-v8::Local<v8::Object> APIBinding::CreateInstance(v8::Local<v8::Context> context,
- v8::Isolate* isolate) {
+v8::Local<v8::Object> APIBinding::CreateInstance(
+ v8::Local<v8::Context> context,
+ v8::Isolate* isolate,
+ APIEventHandler* event_handler) {
// TODO(devlin): APIs may change depending on which features are available,
// but we should be able to cache the unconditional methods on an object
// template, create the object, and then add any conditional methods.
@@ -229,6 +243,18 @@ v8::Local<v8::Object> APIBinding::CreateInstance(v8::Local<v8::Context> context,
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;
}

Powered by Google App Engine
This is Rietveld 408576698