10 * Fast-native callbacks for use from JS.
11 * They set their results on the current fixture instance.
14 static VersionFixture *callbackData = NULL;
16 JSBool CheckVersionHasXML(JSContext *cx, uintN argc, jsval *vp);
17 JSBool DisableXMLOption(JSContext *cx, uintN argc, jsval *vp);
18 JSBool CallSetVersion17(JSContext *cx, uintN argc, jsval *vp);
19 JSBool CheckNewScriptNoXML(JSContext *cx, uintN argc, jsval *vp);
20 JSBool OverrideVersion15(JSContext *cx, uintN argc, jsval *vp);
21 JSBool CaptureVersion(JSContext *cx, uintN argc, jsval *vp);
22 JSBool CheckOverride(JSContext *cx, uintN argc, jsval *vp);
23 JSBool EvalScriptVersion16(JSContext *cx, uintN argc, jsval *vp);
25 struct VersionFixture : public JSAPITest
32 captured = JSVERSION_UNKNOWN;
33 return JS_DefineFunction(cx, global, "checkVersionHasXML", CheckVersionHasXML, 0, 0) &&
34 JS_DefineFunction(cx, global, "disableXMLOption", DisableXMLOption, 0, 0) &&
35 JS_DefineFunction(cx, global, "callSetVersion17", CallSetVersion17, 0, 0) &&
36 JS_DefineFunction(cx, global, "checkNewScriptNoXML", CheckNewScriptNoXML, 0, 0) &&
37 JS_DefineFunction(cx, global, "overrideVersion15", OverrideVersion15, 0, 0) &&
38 JS_DefineFunction(cx, global, "captureVersion", CaptureVersion, 0, 0) &&
39 JS_DefineFunction(cx, global, "checkOverride", CheckOverride, 1, 0) &&
40 JS_DefineFunction(cx, global, "evalScriptVersion16",
41 EvalScriptVersion16, 0, 0);
44 JSObject *fakeScript(const char *contents, size_t length) {
45 return JS_CompileScript(cx, global, contents, length, "<test>", 1);
48 bool hasXML(uintN version) {
49 return VersionHasXML(JSVersion(version));
52 bool hasXML(JSScript *script) {
53 return hasXML(script->getVersion());
57 return OptionsHasXML(JS_GetOptions(cx));
60 bool checkOptionsHasNoXML() {
61 CHECK(!OptionsHasXML(JS_GetOptions(cx)));
65 bool disableXMLOption() {
66 JS_SetOptions(cx, JS_GetOptions(cx) & ~JSOPTION_XML);
70 bool checkVersionIsOverridden() {
71 CHECK(cx->isVersionOverridden());
75 /* Check that script compilation results in a version without XML. */
76 bool checkNewScriptNoXML() {
77 JSObject *scriptObj = fakeScript("", 0);
79 CHECK(!hasXML(JS_GetScriptFromObject(scriptObj)->getVersion()));
83 bool checkVersionHasXML() {
84 CHECK(VersionHasXML(cx->findVersion()));
88 bool setVersion(JSVersion version) {
89 CHECK(JS_GetVersion(cx) != version);
90 JS_SetVersion(cx, version);
94 bool evalVersion(const jschar *chars, size_t len, JSVersion version) {
95 CHECK(JS_GetVersion(cx) != version);
97 CHECK(JS_EvaluateUCScriptForPrincipalsVersion(
98 cx, global, NULL, chars, len, "<test>", 0, &rval, version));
102 bool toggleXML(bool shouldEnable) {
103 CHECK(hasXML() == !shouldEnable);
104 JS_ToggleOptions(cx, JSOPTION_XML);
105 CHECK(hasXML() == shouldEnable);
110 return toggleXML(false);
114 return toggleXML(true);
118 /* Callbacks to throw into JS-land. */
121 CallSetVersion17(JSContext *cx, uintN argc, jsval *vp)
123 return callbackData->setVersion(JSVERSION_1_7);
127 CheckVersionHasXML(JSContext *cx, uintN argc, jsval *vp)
129 return callbackData->checkVersionHasXML();
133 DisableXMLOption(JSContext *cx, uintN argc, jsval *vp)
135 return callbackData->disableXMLOption();
139 CheckNewScriptNoXML(JSContext *cx, uintN argc, jsval *vp)
141 return callbackData->checkNewScriptNoXML();
145 OverrideVersion15(JSContext *cx, uintN argc, jsval *vp)
147 if (!callbackData->setVersion(JSVERSION_1_5))
149 return callbackData->checkVersionIsOverridden();
153 EvalScriptVersion16(JSContext *cx, uintN argc, jsval *vp)
155 JS_ASSERT(argc == 1);
156 jsval *argv = JS_ARGV(cx, vp);
157 JS_ASSERT(JSVAL_IS_STRING(argv[0]));
158 JSString *str = JSVAL_TO_STRING(argv[0]);
159 const jschar *chars = str->getChars(cx);
161 size_t len = str->length();
162 return callbackData->evalVersion(chars, len, JSVERSION_1_6);
166 CaptureVersion(JSContext *cx, uintN argc, jsval *vp)
168 callbackData->captured = JS_GetVersion(cx);
173 CheckOverride(JSContext *cx, uintN argc, jsval *vp)
175 JS_ASSERT(argc == 1);
176 jsval *argv = JS_ARGV(cx, vp);
177 JS_ASSERT(JSVAL_IS_BOOLEAN(argv[0]));
178 bool shouldHaveOverride = !!JSVAL_TO_BOOLEAN(argv[0]);
179 return shouldHaveOverride == cx->isVersionOverridden();
183 * See bug 611462. We are checking that the XML option setting from a JSAPI
184 * call is propagated to newly compiled scripts, instead of inheriting the XML
185 * setting from a script on the stack.
187 BEGIN_FIXTURE_TEST(VersionFixture, testOptionsAreUsedForVersionFlags)
191 /* Enable XML and compile a script to activate. */
193 const char toActivateChars[] =
194 "checkVersionHasXML();"
195 "disableXMLOption();"
196 "callSetVersion17();"
197 "checkNewScriptNoXML();";
198 JSObject *toActivate = fakeScript(toActivateChars, sizeof(toActivateChars) - 1);
200 CHECK(hasXML(JS_GetScriptFromObject(toActivate)));
204 /* Activate the script. */
206 CHECK(JS_ExecuteScript(cx, global, toActivate, &dummy));
209 END_FIXTURE_TEST(VersionFixture, testOptionsAreUsedForVersionFlags)
212 * When re-entering the virtual machine through a *Version API the version
213 * is no longer forced -- it continues with its natural push/pop oriented
214 * version progression. This is maintained by the |AutoVersionAPI| class in
217 BEGIN_FIXTURE_TEST(VersionFixture, testEntryLosesOverride)
219 EXEC("overrideVersion15(); evalScriptVersion16('checkOverride(false); captureVersion()');");
220 CHECK(captured == JSVERSION_1_6);
223 * Override gets propagated to default version as non-override when you leave the VM's execute
226 CHECK(JS_GetVersion(cx) == JSVERSION_1_5);
227 CHECK(!cx->isVersionOverridden());
230 END_FIXTURE_TEST(VersionFixture, testEntryLosesOverride)
233 * EvalScriptVersion does not propagate overrides to its caller, it
234 * restores things exactly as they were before the call. This is as opposed to
235 * the normal (no Version suffix) API which propagates overrides
238 BEGIN_FIXTURE_TEST(VersionFixture, testReturnLosesOverride)
240 CHECK(JS_GetVersion(cx) == JSVERSION_ECMA_5);
242 "checkOverride(false);"
243 "evalScriptVersion16('overrideVersion15();');"
244 "checkOverride(false);"
247 CHECK(captured == JSVERSION_ECMA_5);
250 END_FIXTURE_TEST(VersionFixture, testReturnLosesOverride)
252 BEGIN_FIXTURE_TEST(VersionFixture, testEvalPropagatesOverride)
254 CHECK(JS_GetVersion(cx) == JSVERSION_ECMA_5);
256 "checkOverride(false);"
257 "eval('overrideVersion15();');"
258 "checkOverride(true);"
261 CHECK(captured == JSVERSION_1_5);
264 END_FIXTURE_TEST(VersionFixture, testEvalPropagatesOverride)