1f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
2f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Redistribution and use in source and binary forms, with or without
3f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// modification, are permitted provided that the following conditions are
4f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// met:
5f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//
6f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//     * Redistributions of source code must retain the above copyright
7f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//       notice, this list of conditions and the following disclaimer.
8f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//     * Redistributions in binary form must reproduce the above
9f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//       copyright notice, this list of conditions and the following
10f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//       disclaimer in the documentation and/or other materials provided
11f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//       with the distribution.
12f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//     * Neither the name of Google Inc. nor the names of its
13f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//       contributors may be used to endorse or promote products derived
14f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//       from this software without specific prior written permission.
15f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org//
16f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
28196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
29f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h"
31f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
32f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgusing namespace v8;
33f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgnamespace i = v8::internal;
34f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
35f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgnamespace {
36f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgclass HarmonyIsolate {
37f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org public:
38f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HarmonyIsolate() {
39f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    isolate_ = Isolate::New();
40f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    isolate_->Enter();
41f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
42f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
43f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  ~HarmonyIsolate() {
44f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    isolate_->Exit();
45f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    isolate_->Dispose();
46f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
47f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
48f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Isolate* GetIsolate() const { return isolate_; }
49f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
50f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org private:
51f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Isolate* isolate_;
52f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org};
53f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
54f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
55f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
56f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgTEST(MicrotaskDeliverySimple) {
57f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HarmonyIsolate isolate;
58f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HandleScope scope(isolate.GetIsolate());
59f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LocalContext context(isolate.GetIsolate());
60f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  CompileRun(
61f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "var ordering = [];"
62f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "var resolver = {};"
63f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "function handler(resolve) { resolver.resolve = resolve; }"
64f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "var obj = {};"
65f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "var observeOrders = [1, 4];"
66f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "function observer() {"
67f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "ordering.push(observeOrders.shift());"
68f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "resolver.resolve();"
69f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "}"
70f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "var p = new Promise(handler);"
71f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "p.then(function() {"
72f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "ordering.push(2);"
73f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "}).then(function() {"
74f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "ordering.push(3);"
75f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "obj.id++;"
76f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "return new Promise(handler);"
77f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "}).then(function() {"
78f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "ordering.push(5);"
79f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "}).then(function() {"
80f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "ordering.push(6);"
81f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "});"
82f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "Object.observe(obj, observer);"
83f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "obj.id = 1;");
84f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  CHECK_EQ(6, CompileRun("ordering.length")->Int32Value());
85f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  CHECK_EQ(1, CompileRun("ordering[0]")->Int32Value());
86f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value());
87f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  CHECK_EQ(3, CompileRun("ordering[2]")->Int32Value());
88f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  CHECK_EQ(4, CompileRun("ordering[3]")->Int32Value());
89f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  CHECK_EQ(5, CompileRun("ordering[4]")->Int32Value());
90f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  CHECK_EQ(6, CompileRun("ordering[5]")->Int32Value());
91f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
92f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
93f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
94f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgTEST(MicrotaskPerIsolateState) {
95f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HarmonyIsolate isolate;
96f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HandleScope scope(isolate.GetIsolate());
97f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LocalContext context1(isolate.GetIsolate());
98c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  isolate.GetIsolate()->SetAutorunMicrotasks(false);
99f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  CompileRun(
100f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      "var obj = { calls: 0 };");
101f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Handle<Value> obj = CompileRun("obj");
102f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  {
103f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LocalContext context2(isolate.GetIsolate());
104f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    context2->Global()->Set(String::NewFromUtf8(isolate.GetIsolate(), "obj"),
105f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            obj);
106f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    CompileRun(
107f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "var resolver = {};"
108f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "new Promise(function(resolve) {"
109f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          "resolver.resolve = resolve;"
110f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "}).then(function() {"
111f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          "obj.calls++;"
112f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "});"
113f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "(function() {"
114f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          "resolver.resolve();"
115f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "})();");
116f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
117f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  {
118f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LocalContext context3(isolate.GetIsolate());
119f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    context3->Global()->Set(String::NewFromUtf8(isolate.GetIsolate(), "obj"),
120f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            obj);
121f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    CompileRun(
122f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "var foo = { id: 1 };"
123f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "Object.observe(foo, function() {"
124f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          "obj.calls++;"
125f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "});"
126f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        "foo.id++;");
127f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
128f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  {
129f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LocalContext context4(isolate.GetIsolate());
130f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    context4->Global()->Set(String::NewFromUtf8(isolate.GetIsolate(), "obj"),
131f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                            obj);
132c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org    isolate.GetIsolate()->RunMicrotasks();
133f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    CHECK_EQ(2, CompileRun("obj.calls")->Int32Value());
134f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
135f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
136