OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "bindings/core/v8/ScriptModule.h" | 5 #include "bindings/core/v8/ScriptModule.h" |
6 | 6 |
7 #include "bindings/core/v8/V8BindingForTesting.h" | 7 #include "bindings/core/v8/V8BindingForTesting.h" |
| 8 #include "bindings/core/v8/V8PerContextData.h" |
| 9 #include "core/dom/ScriptModuleResolver.h" |
| 10 #include "core/testing/DummyModulator.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
9 #include "v8/include/v8.h" | 12 #include "v8/include/v8.h" |
10 | 13 |
11 namespace blink { | 14 namespace blink { |
12 | 15 |
13 namespace { | 16 namespace { |
14 | 17 |
| 18 class TestScriptModuleResolver final : public ScriptModuleResolver { |
| 19 public: |
| 20 TestScriptModuleResolver() {} |
| 21 virtual ~TestScriptModuleResolver() {} |
| 22 |
| 23 size_t resolveCount() const { return m_specifiers.size(); } |
| 24 const Vector<String>& specifiers() const { return m_specifiers; } |
| 25 void pushScriptModule(ScriptModule scriptModule) { |
| 26 m_scriptModules.push_back(scriptModule); |
| 27 } |
| 28 |
| 29 private: |
| 30 // Implements ScriptModuleResolver: |
| 31 |
| 32 void registerModuleScript(ModuleScript*) override { NOTREACHED(); } |
| 33 |
| 34 ScriptModule resolve(const String& specifier, |
| 35 const ScriptModule&, |
| 36 ExceptionState&) override { |
| 37 m_specifiers.push_back(specifier); |
| 38 return m_scriptModules.takeFirst(); |
| 39 } |
| 40 |
| 41 Vector<String> m_specifiers; |
| 42 Deque<ScriptModule> m_scriptModules; |
| 43 }; |
| 44 |
| 45 class ScriptModuleTestModulator final : public DummyModulator { |
| 46 public: |
| 47 ScriptModuleTestModulator(); |
| 48 virtual ~ScriptModuleTestModulator() {} |
| 49 |
| 50 DECLARE_TRACE(); |
| 51 |
| 52 TestScriptModuleResolver* testScriptModuleResolver() { |
| 53 return m_resolver.get(); |
| 54 } |
| 55 |
| 56 private: |
| 57 // Implements Modulator: |
| 58 |
| 59 ScriptModuleResolver* scriptModuleResolver() override { |
| 60 return m_resolver.get(); |
| 61 } |
| 62 |
| 63 Member<TestScriptModuleResolver> m_resolver; |
| 64 }; |
| 65 |
| 66 ScriptModuleTestModulator::ScriptModuleTestModulator() |
| 67 : m_resolver(new TestScriptModuleResolver) {} |
| 68 |
| 69 DEFINE_TRACE(ScriptModuleTestModulator) { |
| 70 visitor->trace(m_resolver); |
| 71 DummyModulator::trace(visitor); |
| 72 } |
| 73 |
15 TEST(ScriptModuleTest, compileSuccess) { | 74 TEST(ScriptModuleTest, compileSuccess) { |
16 V8TestingScope scope; | 75 V8TestingScope scope; |
17 ScriptModule module = | 76 ScriptModule module = |
18 ScriptModule::compile(scope.isolate(), "export const a = 42;", "foo.js"); | 77 ScriptModule::compile(scope.isolate(), "export const a = 42;", "foo.js"); |
19 ASSERT_FALSE(module.isNull()); | 78 ASSERT_FALSE(module.isNull()); |
20 } | 79 } |
21 | 80 |
22 TEST(ScriptModuleTest, compileFail) { | 81 TEST(ScriptModuleTest, compileFail) { |
23 V8TestingScope scope; | 82 V8TestingScope scope; |
24 ScriptModule module = | 83 ScriptModule module = |
25 ScriptModule::compile(scope.isolate(), "123 = 456", "foo.js"); | 84 ScriptModule::compile(scope.isolate(), "123 = 456", "foo.js"); |
26 ASSERT_TRUE(module.isNull()); | 85 ASSERT_TRUE(module.isNull()); |
27 } | 86 } |
28 | 87 |
| 88 TEST(ScriptModuleTest, instantiateNoDeps) { |
| 89 V8TestingScope scope; |
| 90 |
| 91 auto modulator = new ScriptModuleTestModulator(); |
| 92 auto resolver = modulator->testScriptModuleResolver(); |
| 93 |
| 94 auto contextData = V8PerContextData::from(scope.context()); |
| 95 contextData->setModulator(modulator); |
| 96 |
| 97 ScriptModule module = |
| 98 ScriptModule::compile(scope.isolate(), "export const a = 42;", "foo.js"); |
| 99 ASSERT_FALSE(module.isNull()); |
| 100 ScriptValue exception = module.instantiate(scope.getScriptState()); |
| 101 ASSERT_TRUE(exception.isEmpty()); |
| 102 |
| 103 EXPECT_EQ(0u, resolver->resolveCount()); |
| 104 } |
| 105 |
| 106 TEST(ScriptModuleTest, instantiateWithDeps) { |
| 107 V8TestingScope scope; |
| 108 |
| 109 auto modulator = new ScriptModuleTestModulator(); |
| 110 auto resolver = modulator->testScriptModuleResolver(); |
| 111 |
| 112 auto contextData = V8PerContextData::from(scope.context()); |
| 113 contextData->setModulator(modulator); |
| 114 |
| 115 ScriptModule moduleA = |
| 116 ScriptModule::compile(scope.isolate(), "export const a = 'a';", "foo.js"); |
| 117 ASSERT_FALSE(moduleA.isNull()); |
| 118 resolver->pushScriptModule(moduleA); |
| 119 |
| 120 ScriptModule moduleB = |
| 121 ScriptModule::compile(scope.isolate(), "export const b = 'b';", "foo.js"); |
| 122 ASSERT_FALSE(moduleB.isNull()); |
| 123 resolver->pushScriptModule(moduleB); |
| 124 |
| 125 ScriptModule module = ScriptModule::compile( |
| 126 scope.isolate(), "import 'a'; import 'b'; export const c = 123;", "c.js"); |
| 127 ASSERT_FALSE(module.isNull()); |
| 128 ScriptValue exception = module.instantiate(scope.getScriptState()); |
| 129 ASSERT_TRUE(exception.isEmpty()); |
| 130 |
| 131 ASSERT_EQ(2u, resolver->resolveCount()); |
| 132 EXPECT_EQ("a", resolver->specifiers()[0]); |
| 133 EXPECT_EQ("b", resolver->specifiers()[1]); |
| 134 } |
| 135 |
29 } // namespace | 136 } // namespace |
30 | 137 |
31 } // namespace blink | 138 } // namespace blink |
OLD | NEW |