summaryrefslogtreecommitdiff
path: root/chromium/extensions/renderer/bindings/api_signature.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-12 14:27:29 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-13 09:35:20 +0000
commitc30a6232df03e1efbd9f3b226777b07e087a1122 (patch)
treee992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/extensions/renderer/bindings/api_signature.cc
parent7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff)
downloadqtwebengine-chromium-85-based.tar.gz
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/extensions/renderer/bindings/api_signature.cc')
-rw-r--r--chromium/extensions/renderer/bindings/api_signature.cc28
1 files changed, 24 insertions, 4 deletions
diff --git a/chromium/extensions/renderer/bindings/api_signature.cc b/chromium/extensions/renderer/bindings/api_signature.cc
index 03b34af7ad7..e617533e508 100644
--- a/chromium/extensions/renderer/bindings/api_signature.cc
+++ b/chromium/extensions/renderer/bindings/api_signature.cc
@@ -19,10 +19,9 @@ namespace extensions {
namespace {
bool HasCallback(const std::vector<std::unique_ptr<ArgumentSpec>>& signature) {
- // TODO(devlin): This is how extension APIs have always determined if a
- // function has a callback, but it seems a little silly. In the long run (once
- // signatures are generated), it probably makes sense to indicate this
- // differently.
+ // TODO(tjudkins): Once we change the APISignature to represent the whole
+ // signature including any asynchronous return, we should replace this with a
+ // method on the APISignature object itself.
return !signature.empty() &&
signature.back()->type() == ArgumentType::FUNCTION;
}
@@ -409,6 +408,27 @@ APISignature::APISignature(const base::ListValue& specification) {
has_callback_ = HasCallback(signature_);
}
+APISignature::APISignature(const base::Value& specification_list,
+ bool supports_promises) {
+ auto size = specification_list.GetList().size() + (supports_promises ? 1 : 0);
+ signature_.reserve(size);
+ for (const auto& value : specification_list.GetList()) {
+ CHECK(value.is_dict());
+ signature_.push_back(std::make_unique<ArgumentSpec>(value));
+ }
+ // To allow promise supporting APIs to instead take a callback, we add an
+ // allowed function to the end of the signature.
+ if (supports_promises) {
+ auto callback = std::make_unique<ArgumentSpec>(ArgumentType::FUNCTION);
+ callback->set_name("callback");
+ signature_.push_back(std::move(callback));
+ }
+
+ has_callback_ = HasCallback(signature_);
+ DCHECK(!supports_promises || has_callback_)
+ << "If an API supports promises, it must also support callbacks";
+}
+
APISignature::APISignature(std::vector<std::unique_ptr<ArgumentSpec>> signature)
: signature_(std::move(signature)),
has_callback_(HasCallback(signature_)) {}