Expose %IteratorPrototype% as an intrinsic in the public API.
The WebIDL spec expects iterator objects from interfaces that declare pair iterators to ultimately inherit from %IteratorPrototype%. Expose the intrinsic object in the public API so we can use it in Blink's bindings code. BUG=chromium:689576 R=caitp@igalia.com,jkummerow@chromium.org,jochen@chromium.org Review-Url: https://codereview.chromium.org/2784543004 Cr-Commit-Position: refs/heads/master@{#44472}
This commit is contained in:
parent
1329d15e99
commit
5ec1cddcdd
@ -4755,7 +4755,8 @@ class V8_EXPORT External : public Value {
|
|||||||
F(ArrayProto_entries, array_entries_iterator) \
|
F(ArrayProto_entries, array_entries_iterator) \
|
||||||
F(ArrayProto_forEach, array_for_each_iterator) \
|
F(ArrayProto_forEach, array_for_each_iterator) \
|
||||||
F(ArrayProto_keys, array_keys_iterator) \
|
F(ArrayProto_keys, array_keys_iterator) \
|
||||||
F(ArrayProto_values, array_values_iterator)
|
F(ArrayProto_values, array_values_iterator) \
|
||||||
|
F(IteratorPrototype, initial_iterator_prototype)
|
||||||
|
|
||||||
enum Intrinsic {
|
enum Intrinsic {
|
||||||
#define V8_DECL_INTRINSIC(name, iname) k##name,
|
#define V8_DECL_INTRINSIC(name, iname) k##name,
|
||||||
|
@ -25901,6 +25901,78 @@ TEST(AccessCheckedToStringTag) {
|
|||||||
CHECK_EQ(0, strcmp(*result_denied, "[object Object]"));
|
CHECK_EQ(0, strcmp(*result_denied, "[object Object]"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(TemplateIteratorPrototypeIntrinsics) {
|
||||||
|
v8::Isolate* isolate = CcTest::isolate();
|
||||||
|
v8::HandleScope scope(isolate);
|
||||||
|
LocalContext env;
|
||||||
|
|
||||||
|
// Object templates.
|
||||||
|
{
|
||||||
|
Local<ObjectTemplate> object_template = v8::ObjectTemplate::New(isolate);
|
||||||
|
object_template->SetIntrinsicDataProperty(v8_str("iter_proto"),
|
||||||
|
v8::kIteratorPrototype);
|
||||||
|
Local<Object> object =
|
||||||
|
object_template->NewInstance(env.local()).ToLocalChecked();
|
||||||
|
CHECK(env->Global()->Set(env.local(), v8_str("obj"), object).FromJust());
|
||||||
|
ExpectTrue("obj.iter_proto === [][Symbol.iterator]().__proto__.__proto__");
|
||||||
|
}
|
||||||
|
// Setting %IteratorProto% on the function object's prototype template.
|
||||||
|
{
|
||||||
|
Local<FunctionTemplate> func_template = v8::FunctionTemplate::New(isolate);
|
||||||
|
func_template->PrototypeTemplate()->SetIntrinsicDataProperty(
|
||||||
|
v8_str("iter_proto"), v8::kIteratorPrototype);
|
||||||
|
Local<Function> func1 =
|
||||||
|
func_template->GetFunction(env.local()).ToLocalChecked();
|
||||||
|
CHECK(env->Global()->Set(env.local(), v8_str("func1"), func1).FromJust());
|
||||||
|
Local<Function> func2 =
|
||||||
|
func_template->GetFunction(env.local()).ToLocalChecked();
|
||||||
|
CHECK(env->Global()->Set(env.local(), v8_str("func2"), func2).FromJust());
|
||||||
|
ExpectTrue(
|
||||||
|
"func1.prototype.iter_proto === "
|
||||||
|
"[][Symbol.iterator]().__proto__.__proto__");
|
||||||
|
ExpectTrue(
|
||||||
|
"func2.prototype.iter_proto === "
|
||||||
|
"[][Symbol.iterator]().__proto__.__proto__");
|
||||||
|
ExpectTrue("func1.prototype.iter_proto === func2.prototype.iter_proto");
|
||||||
|
|
||||||
|
Local<Object> instance1 = func1->NewInstance(env.local()).ToLocalChecked();
|
||||||
|
CHECK(env->Global()
|
||||||
|
->Set(env.local(), v8_str("instance1"), instance1)
|
||||||
|
.FromJust());
|
||||||
|
ExpectFalse("instance1.hasOwnProperty('iter_proto')");
|
||||||
|
ExpectTrue("'iter_proto' in instance1.__proto__");
|
||||||
|
ExpectTrue(
|
||||||
|
"instance1.iter_proto === [][Symbol.iterator]().__proto__.__proto__");
|
||||||
|
}
|
||||||
|
// Put %IteratorProto% in a function object's inheritance chain.
|
||||||
|
{
|
||||||
|
Local<FunctionTemplate> parent_template =
|
||||||
|
v8::FunctionTemplate::New(isolate);
|
||||||
|
parent_template->RemovePrototype(); // Remove so there is no name clash.
|
||||||
|
parent_template->SetIntrinsicDataProperty(v8_str("prototype"),
|
||||||
|
v8::kIteratorPrototype);
|
||||||
|
Local<FunctionTemplate> func_template = v8::FunctionTemplate::New(isolate);
|
||||||
|
func_template->Inherit(parent_template);
|
||||||
|
|
||||||
|
Local<Function> func =
|
||||||
|
func_template->GetFunction(env.local()).ToLocalChecked();
|
||||||
|
CHECK(env->Global()->Set(env.local(), v8_str("func"), func).FromJust());
|
||||||
|
ExpectTrue(
|
||||||
|
"func.prototype.__proto__ === "
|
||||||
|
"[][Symbol.iterator]().__proto__.__proto__");
|
||||||
|
|
||||||
|
Local<Object> func_instance =
|
||||||
|
func->NewInstance(env.local()).ToLocalChecked();
|
||||||
|
CHECK(env->Global()
|
||||||
|
->Set(env.local(), v8_str("instance"), func_instance)
|
||||||
|
.FromJust());
|
||||||
|
ExpectTrue(
|
||||||
|
"instance.__proto__.__proto__ === "
|
||||||
|
"[][Symbol.iterator]().__proto__.__proto__");
|
||||||
|
ExpectTrue("instance.__proto__.__proto__.__proto__ === Object.prototype");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST(ObjectTemplateArrayProtoIntrinsics) {
|
TEST(ObjectTemplateArrayProtoIntrinsics) {
|
||||||
v8::Isolate* isolate = CcTest::isolate();
|
v8::Isolate* isolate = CcTest::isolate();
|
||||||
v8::HandleScope scope(isolate);
|
v8::HandleScope scope(isolate);
|
||||||
|
Loading…
Reference in New Issue
Block a user