void rgb_matrix_indicators_user(void) { #ifdef RGB_MATRIX_ENABLE switch (biton32(layer_state)) { case _RAISE: for (int i = 0; i < DRIVER_LED_TOTAL; i++) { if (HAS_FLAGS(g_led_config.flags[i], LED_FLAG_MODIFIER)) { rgb_matrix_set_color(i, 0x6B, 0x00, 0x80); } else { rgb_matrix_set_color(i, 0x00, 0xFF, 0x00); } } break; case _LOWER: for (int i = 0; i < DRIVER_LED_TOTAL; i++) { if (HAS_FLAGS(g_led_config.flags[i], LED_FLAG_MODIFIER)) { rgb_matrix_set_color(i, 0xFF, 0xA5, 0x00); } else { rgb_matrix_set_color(i, 0x00, 0x67, 0xC7); } } break; case _ADJUST: for (int i = 0; i < DRIVER_LED_TOTAL; i++) { rgb_matrix_set_color(i, 0xFF, 0x99, 0x00); } rgb_matrix_set_color(1, 0xFF, 0x00, 0x00); break; default: break; } #endif }
void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue, bool default_layer) { for (int i = 0; i < DRIVER_LED_TOTAL; i++) { if (HAS_FLAGS(g_led_config.flags[i], LED_FLAG_MODIFIER)) { rgb_matrix_set_color( i, red, green, blue ); } } }
XPC_NW_AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { JSProperty *prop; JSObject *pobj; jsid idAsId; if (!::JS_ValueToId(cx, id, &idAsId) || !OBJ_LOOKUP_PROPERTY(cx, obj, idAsId, &pobj, &prop)) { return JS_FALSE; } // Do not allow scripted getters or setters on XPCNativeWrappers. NS_ASSERTION(prop && pobj == obj, "Wasn't this property just added?"); JSScopeProperty *sprop = (JSScopeProperty *) prop; uint8 attrs = sprop->attrs; OBJ_DROP_PROPERTY(cx, pobj, prop); if (attrs & (JSPROP_GETTER | JSPROP_SETTER)) { return ThrowException(NS_ERROR_ILLEGAL_VALUE, cx); } jsval flags; ::JS_GetReservedSlot(cx, obj, 0, &flags); if (!HAS_FLAGS(flags, FLAG_RESOLVING)) { return JS_TRUE; } // Note: no need to protect *vp from GC here, since it's already in the slot // on |obj|. return EnsureLegalActivity(cx, obj) && XPC_NW_RewrapIfDeepWrapper(cx, obj, *vp, vp); }
static JSBool XPC_SJOW_AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { // The constructor and toString properties needs to live on the safe // wrapper. if (id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_CONSTRUCTOR) || id == GetRTStringByIndex(cx, XPCJSRuntime::IDX_TO_STRING)) { return JS_TRUE; } obj = FindSafeObject(obj); NS_ASSERTION(obj != nsnull, "FindSafeObject() returned null in class hook!"); // Do nothing here if we're in the middle of resolving a property on // this safe wrapper. jsval isResolving; JSBool ok = ::JS_GetReservedSlot(cx, obj, XPC_SJOW_SLOT_IS_RESOLVING, &isResolving); if (!ok || HAS_FLAGS(isResolving, FLAG_RESOLVING)) { return ok; } JSObject *unsafeObj = GetUnsafeObject(obj); if (!unsafeObj) { return ThrowException(NS_ERROR_UNEXPECTED, cx); } // Check that the caller can access the unsafe object. if (!CanCallerAccess(cx, unsafeObj)) { // CanCallerAccess() already threw for us. return JS_FALSE; } return XPCWrapper::AddProperty(cx, obj, JS_FALSE, unsafeObj, id, vp); }
// Because of the drastically different ways that same- and cross-origin XOWs // work, we have to call JS_ClearScope when a XOW changes from being same- // origin to cross-origin. Normally, there are defined places in Gecko where // this happens and they notify us. However, UniversalXPConnect causes the // same transition without any notifications. We could try to detect when this // happens, but doing so would require calling JS_ClearScope from random // hooks, which is bad. // // The compromise is the UXPCObject. When resolving a property on a XOW as // same-origin because of UniversalXPConnect, we actually resolve it on the // UXPCObject (which is just a XOW for the same object). This causes the JS // engine to do all of its work on another object, not polluting the main // object. However, if the get results in calling a setter, the engine still // uses the regular object as 'this', ensuring that the UXPCObject doesn't // leak to script. static JSObject * GetUXPCObject(JSContext *cx, JSObject *obj) { NS_ASSERTION(STOBJ_GET_CLASS(obj) == &sXPC_XOW_JSClass.base, "wrong object"); jsval v; if (!JS_GetReservedSlot(cx, obj, XPCWrapper::sFlagsSlot, &v)) { return nsnull; } if (HAS_FLAGS(v, FLAG_IS_UXPC_OBJECT)) { return obj; } if (!JS_GetReservedSlot(cx, obj, sUXPCObjectSlot, &v)) { return nsnull; } if (JSVAL_IS_OBJECT(v)) { return JSVAL_TO_OBJECT(v); } JSObject *uxpco = JS_NewObjectWithGivenProto(cx, &sXPC_XOW_JSClass.base, nsnull, STOBJ_GET_PARENT(obj)); if (!uxpco) { return nsnull; } JSAutoTempValueRooter tvr(cx, uxpco); jsval wrappedObj, parentScope; if (!JS_GetReservedSlot(cx, obj, XPCWrapper::sWrappedObjSlot, &wrappedObj) || !JS_GetReservedSlot(cx, obj, XPC_XOW_ScopeSlot, &parentScope)) { return nsnull; } if (!JS_SetReservedSlot(cx, uxpco, XPCWrapper::sWrappedObjSlot, wrappedObj) || !JS_SetReservedSlot(cx, uxpco, XPCWrapper::sFlagsSlot, INT_TO_JSVAL(FLAG_IS_UXPC_OBJECT)) || !JS_SetReservedSlot(cx, uxpco, XPC_XOW_ScopeSlot, parentScope)) { return nsnull; } if (!JS_SetReservedSlot(cx, obj, sUXPCObjectSlot, OBJECT_TO_JSVAL(uxpco))) { return nsnull; } return uxpco; }
static JSBool XPC_COW_AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { obj = GetWrapper(obj); jsval resolving; if (!JS_GetReservedSlot(cx, obj, XPCWrapper::sFlagsSlot, &resolving)) { return JS_FALSE; } if (HAS_FLAGS(resolving, FLAG_RESOLVING)) { // Allow us to define a property on ourselves. return JS_TRUE; } // Someone's adding a property to us. We need to protect ourselves from // getters and setters. JSObject *wrappedObj = GetWrappedObject(cx, obj); if (!wrappedObj) { return ThrowException(NS_ERROR_ILLEGAL_VALUE, cx); } jsid interned_id; JSPropertyDescriptor desc; if (!JS_ValueToId(cx, id, &interned_id) || !XPCWrapper::GetPropertyAttrs(cx, obj, interned_id, JSRESOLVE_QUALIFIED, JS_TRUE, &desc)) { return JS_FALSE; } NS_ASSERTION(desc.obj == obj, "The JS engine lies!"); if (desc.attrs & (JSPROP_GETTER | JSPROP_SETTER)) { // Only chrome is allowed to add getters or setters to our object. if (!AllowedToAct(cx, id)) { return JS_FALSE; } } return XPC_COW_RewrapForChrome(cx, obj, vp) && JS_DefinePropertyById(cx, wrappedObj, interned_id, *vp, desc.getter, desc.setter, desc.attrs); }
void WindowNavigated(JSContext *cx, XPCWrappedNative *innerObj) { NS_ABORT_IF_FALSE(innerObj->NeedsXOW(), "About to write to unowned memory"); // First, disconnect the old XOW from the XOW cache. XPCWrappedNativeWithXOW *wnxow = static_cast<XPCWrappedNativeWithXOW *>(innerObj); JSObject *oldXOW = wnxow->GetXOW(); if (oldXOW) { jsval flags = GetFlags(cx, oldXOW); NS_ASSERTION(HAS_FLAGS(flags, FLAG_IS_CACHED), "Wrapper should be cached"); SetFlags(cx, oldXOW, RemoveFlags(flags, FLAG_IS_CACHED)); NS_ASSERTION(wnxow->GetXOW() == oldXOW, "bad XOW in cache"); wnxow->SetXOW(nsnull); } }
static inline JSBool EnsureLegalActivity(JSContext *cx, JSObject *obj) { jsval flags; ::JS_GetReservedSlot(cx, obj, 0, &flags); if (HAS_FLAGS(flags, FLAG_EXPLICIT)) { // Can't make any assertions about the owner of this wrapper. return JS_TRUE; } JSStackFrame *frame = nsnull; uint32 fileFlags = JS_GetTopScriptFilenameFlags(cx, NULL); if (!JS_FrameIterator(cx, &frame) || fileFlags == JSFILENAME_NULL || (fileFlags & JSFILENAME_SYSTEM)) { // We expect implicit native wrappers in system files. return JS_TRUE; } nsIScriptSecurityManager *ssm = XPCWrapper::GetSecurityManager(); if (!ssm) { // If there's no security manager, then we're not running in a browser // context: allow access. return JS_TRUE; } // A last ditch effort to allow access: if the currently-running code // has UniversalXPConnect privileges, then allow access. PRBool isPrivileged; nsresult rv = ssm->IsCapabilityEnabled("UniversalXPConnect", &isPrivileged); if (NS_SUCCEEDED(rv) && isPrivileged) { return JS_TRUE; } // Otherwise, we're looking at a non-system file with a handle on an // implicit wrapper. This is a bug! Deny access. return ThrowException(NS_ERROR_XPC_SECURITY_MANAGER_VETO, cx); }
static JSBool XPC_XOW_AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) { // All AddProperty needs to do is pass on addProperty requests to // same-origin objects, and throw for all else. obj = GetWrapper(obj); jsval resolving; if (!JS_GetReservedSlot(cx, obj, XPCWrapper::sFlagsSlot, &resolving)) { return JS_FALSE; } if (HAS_FLAGS(resolving, FLAG_RESOLVING)) { // Allow us to define a property on ourselves. return JS_TRUE; } JSObject *wrappedObj = GetWrappedObject(cx, obj); if (!wrappedObj) { return ThrowException(NS_ERROR_ILLEGAL_VALUE, cx); } XPCCallContext ccx(JS_CALLER, cx); if (!ccx.IsValid()) { return ThrowException(NS_ERROR_FAILURE, cx); } JSBool privilegeEnabled = JS_FALSE; nsresult rv = CanAccessWrapper(cx, wrappedObj, &privilegeEnabled); if (NS_FAILED(rv)) { if (rv == NS_ERROR_DOM_PROP_ACCESS_DENIED) { // Can't override properties on foreign objects. return ThrowException(rv, cx); } return JS_FALSE; } // Same origin, pass this request along. return XPCWrapper::AddProperty(cx, obj, JS_TRUE, wrappedObj, id, vp); }
static JSBool ShouldBypassNativeWrapper(JSContext *cx, JSObject *obj) { NS_ASSERTION(XPCNativeWrapper::IsNativeWrapper(obj), "Unexpected object"); jsval flags; ::JS_GetReservedSlot(cx, obj, 0, &flags); if (HAS_FLAGS(flags, FLAG_EXPLICIT)) return JS_FALSE; // Check what the script calling us looks like JSScript *script = nsnull; JSStackFrame *fp = cx->fp; while(!script && fp) { script = fp->script; fp = fp->down; } // If there's no script, bypass for now because that's what the old code did. // XXX FIXME: bug 341477 covers figuring out what we _should_ do. return !script || !(::JS_GetScriptFilenameFlags(script) & JSFILENAME_SYSTEM); }