bool doResolve(JSHandleObject obj, JSHandleId id, unsigned flags, JSMutableHandleObject objp) { CHECK_EQUAL(resolveExitCount, 0); AutoIncrCounters incr(this); CHECK_EQUAL(obj, obj1 || obj == obj2); CHECK(JSID_IS_STRING(id)); JSFlatString *str = JS_FlattenString(cx, JSID_TO_STRING(id)); CHECK(str); JS::RootedValue v(cx); if (JS_FlatStringEqualsAscii(str, "x")) { if (obj == obj1) { /* First resolve hook invocation. */ CHECK_EQUAL(resolveEntryCount, 1); EVAL("obj2.y = true", v.address()); CHECK_SAME(v, JSVAL_TRUE); CHECK(JS_DefinePropertyById(cx, obj, id, JSVAL_FALSE, NULL, NULL, 0)); objp.set(obj); return true; } if (obj == obj2) { CHECK_EQUAL(resolveEntryCount, 4); objp.set(NULL); return true; } } else if (JS_FlatStringEqualsAscii(str, "y")) { if (obj == obj2) { CHECK_EQUAL(resolveEntryCount, 2); CHECK(JS_DefinePropertyById(cx, obj, id, JSVAL_NULL, NULL, NULL, 0)); EVAL("obj1.x", v.address()); CHECK(JSVAL_IS_VOID(v)); EVAL("obj1.y", v.address()); CHECK_SAME(v, JSVAL_ZERO); objp.set(obj); return true; } if (obj == obj1) { CHECK_EQUAL(resolveEntryCount, 3); EVAL("obj1.x", v.address()); CHECK(JSVAL_IS_VOID(v)); EVAL("obj1.y", v.address()); CHECK(JSVAL_IS_VOID(v)); EVAL("obj2.y", v.address()); CHECK(JSVAL_IS_NULL(v)); EVAL("obj2.x", v.address()); CHECK(JSVAL_IS_VOID(v)); EVAL("obj1.y = 0", v.address()); CHECK_SAME(v, JSVAL_ZERO); objp.set(obj); return true; } } CHECK(false); return false; }
bool XDRState<mode>::codeFunction(JSMutableHandleObject objp) { if (mode == XDR_DECODE) objp.set(NULL); if (!VersionCheck(this)) return false; return XDRInterpretedFunction(this, NullPtr(), NullPtr(), objp); }
BEGIN_WORKERS_NAMESPACE // Entry point for the DOM. JSBool ResolveWorkerClasses(JSContext* aCx, JSHandleObject aObj, JSHandleId aId, unsigned aFlags, JSMutableHandleObject aObjp) { AssertIsOnMainThread(); // Don't care about assignments, bail now. if (aFlags & JSRESOLVE_ASSIGNING) { aObjp.set(nullptr); return true; } // Make sure our strings are interned. if (JSID_IS_VOID(gStringIDs[0])) { for (uint32_t i = 0; i < ID_COUNT; i++) { JSString* str = JS_InternString(aCx, gStringChars[i]); if (!str) { while (i) { gStringIDs[--i] = JSID_VOID; } return false; } gStringIDs[i] = INTERNED_STRING_TO_JSID(aCx, str); } } bool isChrome = false; bool shouldResolve = false; for (uint32_t i = 0; i < ID_COUNT; i++) { if (gStringIDs[i] == aId) { isChrome = nsContentUtils::IsCallerChrome(); // Don't resolve if this is ChromeWorker and we're not chrome. Otherwise // always resolve. shouldResolve = gStringIDs[ID_ChromeWorker] == aId ? isChrome : true; break; } } if (shouldResolve) { // Don't do anything if workers are disabled. if (!isChrome && !Preferences::GetBool(PREF_WORKERS_ENABLED)) { aObjp.set(nullptr); return true; } JSObject* eventTarget = EventTargetBinding_workers::GetProtoObject(aCx, aObj); if (!eventTarget) { return false; } JSObject* worker = worker::InitClass(aCx, aObj, eventTarget, true); if (!worker) { return false; } if (isChrome && !chromeworker::InitClass(aCx, aObj, worker, true)) { return false; } if (!events::InitClasses(aCx, aObj, true)) { return false; } aObjp.set(aObj); return true; } // Not resolved. aObjp.set(nullptr); return true; }