NS_IMETHODIMP nsVolume::GetMountLockName(nsAString& aMountLockName) { aMountLockName = NS_LITERAL_STRING("volume-") + Name(); aMountLockName.AppendPrintf("-%d", mMountGeneration); return NS_OK; }
void CharacterData::ToCString(nsAString& aBuf, int32_t aOffset, int32_t aLen) const { if (mText.Is2b()) { const char16_t* cp = mText.Get2b() + aOffset; const char16_t* end = cp + aLen; while (cp < end) { char16_t ch = *cp++; if (ch == '&') { aBuf.AppendLiteral("&"); } else if (ch == '<') { aBuf.AppendLiteral("<"); } else if (ch == '>') { aBuf.AppendLiteral(">"); } else if ((ch < ' ') || (ch >= 127)) { aBuf.AppendPrintf("\\u%04x", ch); } else { aBuf.Append(ch); } } } else { unsigned char* cp = (unsigned char*)mText.Get1b() + aOffset; const unsigned char* end = cp + aLen; while (cp < end) { char16_t ch = *cp++; if (ch == '&') { aBuf.AppendLiteral("&"); } else if (ch == '<') { aBuf.AppendLiteral("<"); } else if (ch == '>') { aBuf.AppendLiteral(">"); } else if ((ch < ' ') || (ch >= 127)) { aBuf.AppendPrintf("\\u%04x", ch); } else { aBuf.Append(ch); } } } }
nsresult GfxInfo::GetFeatureStatusImpl(PRInt32 aFeature, PRInt32 *aStatus, nsAString & aSuggestedDriverVersion, GfxDriverInfo* aDriverInfo /* = nsnull */) { *aStatus = nsIGfxInfo::FEATURE_NO_INFO; aSuggestedDriverVersion.SetIsVoid(true); PRInt32 status = nsIGfxInfo::FEATURE_NO_INFO; PRUint32 adapterVendor = 0; PRUint32 adapterDeviceID = 0; nsAutoString adapterDriverVersionString; if (NS_FAILED(GetAdapterVendorID(&adapterVendor)) || NS_FAILED(GetAdapterDeviceID(&adapterDeviceID)) || NS_FAILED(GetAdapterDriverVersion(adapterDriverVersionString))) { return NS_ERROR_FAILURE; } if (adapterVendor != vendorIntel && adapterVendor != vendorNVIDIA && adapterVendor != vendorAMD && adapterVendor != vendorATI && // FIXME - these special hex values are currently used in xpcshell tests introduced by // bug 625160 patch 8/8. Maybe these tests need to be adjusted now that we're only whitelisting // intel/ati/nvidia. adapterVendor != 0xabcd && adapterVendor != 0xdcba && adapterVendor != 0xabab && adapterVendor != 0xdcdc) { *aStatus = FEATURE_BLOCKED_DEVICE; return NS_OK; } PRUint64 driverVersion; if (!ParseDriverVersion(adapterDriverVersionString, &driverVersion)) { return NS_ERROR_FAILURE; } if (aFeature == FEATURE_DIRECT3D_9_LAYERS && mWindowsVersion < gfxWindowsPlatform::kWindowsXP) { *aStatus = FEATURE_BLOCKED_OS_VERSION; return NS_OK; } // ANGLE currently uses D3D10 <-> D3D9 interop, which crashes on Optimus // machines. if (aFeature == FEATURE_WEBGL_ANGLE && gfxWindowsPlatform::IsOptimus()) { *aStatus = FEATURE_BLOCKED_DEVICE; return NS_OK; } OperatingSystem os = WindowsVersionToOperatingSystem(mWindowsVersion); // Windows Server 2003 should be just like Windows XP for present purpose, but still has a different version number. // OTOH Windows Server 2008 R1 and R2 already have the same version numbers as Vista and Seven respectively if (os == DRIVER_OS_WINDOWS_SERVER_2003) os = DRIVER_OS_WINDOWS_XP; const GfxDriverInfo *info; if (aDriverInfo) info = aDriverInfo; else info = &gDriverInfo[0]; if (mHasDriverVersionMismatch) { if (aFeature == nsIGfxInfo::FEATURE_DIRECT3D_10_LAYERS || aFeature == nsIGfxInfo::FEATURE_DIRECT3D_10_1_LAYERS || aFeature == nsIGfxInfo::FEATURE_DIRECT2D) { *aStatus = nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION; return NS_OK; } } // special-case the WinXP test slaves: they have out-of-date drivers, but we still want to // whitelist them, actually we do know that this combination of device and driver version // works well. if (os == DRIVER_OS_WINDOWS_XP && adapterVendor == vendorNVIDIA && adapterDeviceID == 0x0861 && // GeForce 9400 driverVersion == V(6,14,11,7756)) { return NS_OK; } while (info->mOperatingSystem) { if (info->mOperatingSystem != DRIVER_OS_ALL && info->mOperatingSystem != os) { info++; continue; } if (info->mAdapterVendor != GfxDriverInfo::allAdapterVendors && info->mAdapterVendor != adapterVendor) { info++; continue; } if (info->mDevices != GfxDriverInfo::allDevices) { bool deviceMatches = false; for (const PRUint32 *devices = info->mDevices; *devices; ++devices) { if (*devices == adapterDeviceID) { deviceMatches = true; break; } } if (!deviceMatches) { info++; continue; } } bool match = false; switch (info->mComparisonOp) { case DRIVER_LESS_THAN: match = driverVersion < info->mDriverVersion; break; case DRIVER_LESS_THAN_OR_EQUAL: match = driverVersion <= info->mDriverVersion; break; case DRIVER_GREATER_THAN: match = driverVersion > info->mDriverVersion; break; case DRIVER_GREATER_THAN_OR_EQUAL: match = driverVersion >= info->mDriverVersion; break; case DRIVER_EQUAL: match = driverVersion == info->mDriverVersion; break; case DRIVER_NOT_EQUAL: match = driverVersion != info->mDriverVersion; break; case DRIVER_BETWEEN_EXCLUSIVE: match = driverVersion > info->mDriverVersion && driverVersion < info->mDriverVersionMax; break; case DRIVER_BETWEEN_INCLUSIVE: match = driverVersion >= info->mDriverVersion && driverVersion <= info->mDriverVersionMax; break; case DRIVER_BETWEEN_INCLUSIVE_START: match = driverVersion >= info->mDriverVersion && driverVersion < info->mDriverVersionMax; break; default: NS_WARNING("Bogus op in GfxDriverInfo"); break; } if (match) { if (info->mFeature == GfxDriverInfo::allFeatures || info->mFeature == aFeature) { status = info->mFeatureStatus; break; } } info++; } *aStatus = status; if (status == FEATURE_BLOCKED_DRIVER_VERSION) { if (info->mSuggestedVersion) { aSuggestedDriverVersion.AppendPrintf("%s", info->mSuggestedVersion); } else if (info->mComparisonOp == DRIVER_LESS_THAN && info->mDriverVersion != allDriverVersions) { aSuggestedDriverVersion.AppendPrintf("%lld.%lld.%lld.%lld", (info->mDriverVersion & 0xffff000000000000) >> 48, (info->mDriverVersion & 0x0000ffff00000000) >> 32, (info->mDriverVersion & 0x00000000ffff0000) >> 16, (info->mDriverVersion & 0x000000000000ffff)); } }
int32_t GfxInfoBase::FindBlocklistedDeviceInList(const nsTArray<GfxDriverInfo>& info, nsAString& aSuggestedVersion, int32_t aFeature, nsACString& aFailureId, OperatingSystem os) { int32_t status = nsIGfxInfo::FEATURE_STATUS_UNKNOWN; uint32_t i = 0; for (; i < info.Length(); i++) { // Do the operating system check first, no point in getting the driver // info if we won't need to use it. If the OS of the system we are running // on is unknown, we still let DRIVER_OS_ALL catch and disable it; // if the OS of the downloadable entry is unknown, we skip the entry // as invalid. if (info[i].mOperatingSystem == DRIVER_OS_UNKNOWN || (info[i].mOperatingSystem != DRIVER_OS_ALL && info[i].mOperatingSystem != os)) { continue; } if (info[i].mOperatingSystemVersion && info[i].mOperatingSystemVersion != OperatingSystemVersion()) { continue; } // XXX: it would be better not to do this everytime round the loop nsAutoString adapterVendorID; nsAutoString adapterDeviceID; nsAutoString adapterDriverVersionString; if (info[i].mGpu2) { if (NS_FAILED(GetAdapterVendorID2(adapterVendorID)) || NS_FAILED(GetAdapterDeviceID2(adapterDeviceID)) || NS_FAILED(GetAdapterDriverVersion2(adapterDriverVersionString))) { return 0; } } else { if (NS_FAILED(GetAdapterVendorID(adapterVendorID)) || NS_FAILED(GetAdapterDeviceID(adapterDeviceID)) || NS_FAILED(GetAdapterDriverVersion(adapterDriverVersionString))) { return 0; } } #if defined(XP_WIN) || defined(ANDROID) uint64_t driverVersion; ParseDriverVersion(adapterDriverVersionString, &driverVersion); #endif if (!info[i].mAdapterVendor.Equals(GfxDriverInfo::GetDeviceVendor(VendorAll), nsCaseInsensitiveStringComparator()) && !info[i].mAdapterVendor.Equals(adapterVendorID, nsCaseInsensitiveStringComparator())) { continue; } if (info[i].mDevices != GfxDriverInfo::allDevices && info[i].mDevices->Length()) { bool deviceMatches = false; for (uint32_t j = 0; j < info[i].mDevices->Length(); j++) { if ((*info[i].mDevices)[j].Equals(adapterDeviceID, nsCaseInsensitiveStringComparator())) { deviceMatches = true; break; } } if (!deviceMatches) { continue; } } bool match = false; if (!info[i].mHardware.IsEmpty() && !info[i].mHardware.Equals(Hardware())) { continue; } if (!info[i].mModel.IsEmpty() && !info[i].mModel.Equals(Model())) { continue; } if (!info[i].mProduct.IsEmpty() && !info[i].mProduct.Equals(Product())) { continue; } if (!info[i].mManufacturer.IsEmpty() && !info[i].mManufacturer.Equals(Manufacturer())) { continue; } #if defined(XP_WIN) || defined(ANDROID) switch (info[i].mComparisonOp) { case DRIVER_LESS_THAN: match = driverVersion < info[i].mDriverVersion; break; case DRIVER_LESS_THAN_OR_EQUAL: match = driverVersion <= info[i].mDriverVersion; break; case DRIVER_GREATER_THAN: match = driverVersion > info[i].mDriverVersion; break; case DRIVER_GREATER_THAN_OR_EQUAL: match = driverVersion >= info[i].mDriverVersion; break; case DRIVER_EQUAL: match = driverVersion == info[i].mDriverVersion; break; case DRIVER_NOT_EQUAL: match = driverVersion != info[i].mDriverVersion; break; case DRIVER_BETWEEN_EXCLUSIVE: match = driverVersion > info[i].mDriverVersion && driverVersion < info[i].mDriverVersionMax; break; case DRIVER_BETWEEN_INCLUSIVE: match = driverVersion >= info[i].mDriverVersion && driverVersion <= info[i].mDriverVersionMax; break; case DRIVER_BETWEEN_INCLUSIVE_START: match = driverVersion >= info[i].mDriverVersion && driverVersion < info[i].mDriverVersionMax; break; case DRIVER_COMPARISON_IGNORED: // We don't have a comparison op, so we match everything. match = true; break; default: NS_WARNING("Bogus op in GfxDriverInfo"); break; } #else // We don't care what driver version it was. We only check OS version and if // the device matches. match = true; #endif if (match || info[i].mDriverVersion == GfxDriverInfo::allDriverVersions) { if (info[i].mFeature == GfxDriverInfo::allFeatures || info[i].mFeature == aFeature) { status = info[i].mFeatureStatus; if (!info[i].mRuleId.IsEmpty()) { aFailureId = info[i].mRuleId.get(); } else { aFailureId = "FEATURE_FAILURE_DL_BLACKLIST_NO_ID"; } break; } } } #if defined(XP_WIN) // As a very special case, we block D2D on machines with an NVidia 310M GPU // as either the primary or secondary adapter. D2D is also blocked when the // NV 310M is the primary adapter (using the standard blocklisting mechanism). // If the primary GPU already matched something in the blocklist then we // ignore this special rule. See bug 1008759. if (status == nsIGfxInfo::FEATURE_STATUS_UNKNOWN && (aFeature == nsIGfxInfo::FEATURE_DIRECT2D)) { nsAutoString adapterVendorID2; nsAutoString adapterDeviceID2; if ((!NS_FAILED(GetAdapterVendorID2(adapterVendorID2))) && (!NS_FAILED(GetAdapterDeviceID2(adapterDeviceID2)))) { nsAString &nvVendorID = (nsAString &)GfxDriverInfo::GetDeviceVendor(VendorNVIDIA); const nsString nv310mDeviceId = NS_LITERAL_STRING("0x0A70"); if (nvVendorID.Equals(adapterVendorID2, nsCaseInsensitiveStringComparator()) && nv310mDeviceId.Equals(adapterDeviceID2, nsCaseInsensitiveStringComparator())) { status = nsIGfxInfo::FEATURE_BLOCKED_DEVICE; aFailureId = "FEATURE_FAILURE_D2D_NV310M_BLOCK"; } } } // Depends on Windows driver versioning. We don't pass a GfxDriverInfo object // back to the Windows handler, so we must handle this here. if (status == FEATURE_BLOCKED_DRIVER_VERSION) { if (info[i].mSuggestedVersion) { aSuggestedVersion.AppendPrintf("%s", info[i].mSuggestedVersion); } else if (info[i].mComparisonOp == DRIVER_LESS_THAN && info[i].mDriverVersion != GfxDriverInfo::allDriverVersions) { aSuggestedVersion.AppendPrintf("%lld.%lld.%lld.%lld", (info[i].mDriverVersion & 0xffff000000000000) >> 48, (info[i].mDriverVersion & 0x0000ffff00000000) >> 32, (info[i].mDriverVersion & 0x00000000ffff0000) >> 16, (info[i].mDriverVersion & 0x000000000000ffff)); } }
int32_t GfxInfoBase::FindBlocklistedDeviceInList(const nsTArray<GfxDriverInfo>& info, nsAString& aSuggestedVersion, int32_t aFeature, OperatingSystem os) { int32_t status = nsIGfxInfo::FEATURE_STATUS_UNKNOWN; nsAutoString adapterVendorID; nsAutoString adapterDeviceID; nsAutoString adapterDriverVersionString; if (NS_FAILED(GetAdapterVendorID(adapterVendorID)) || NS_FAILED(GetAdapterDeviceID(adapterDeviceID)) || NS_FAILED(GetAdapterDriverVersion(adapterDriverVersionString))) { return 0; } uint64_t driverVersion; ParseDriverVersion(adapterDriverVersionString, &driverVersion); uint32_t i = 0; for (; i < info.Length(); i++) { if (info[i].mOperatingSystem != DRIVER_OS_ALL && info[i].mOperatingSystem != os) { continue; } if (info[i].mOperatingSystemVersion && info[i].mOperatingSystemVersion != OperatingSystemVersion()) { continue; } if (!info[i].mAdapterVendor.Equals(GfxDriverInfo::GetDeviceVendor(VendorAll), nsCaseInsensitiveStringComparator()) && !info[i].mAdapterVendor.Equals(adapterVendorID, nsCaseInsensitiveStringComparator())) { continue; } if (info[i].mDevices != GfxDriverInfo::allDevices && info[i].mDevices->Length()) { bool deviceMatches = false; for (uint32_t j = 0; j < info[i].mDevices->Length(); j++) { if ((*info[i].mDevices)[j].Equals(adapterDeviceID, nsCaseInsensitiveStringComparator())) { deviceMatches = true; break; } } if (!deviceMatches) { continue; } } bool match = false; if (!info[i].mHardware.IsEmpty() && !info[i].mHardware.Equals(Hardware())) { continue; } if (!info[i].mModel.IsEmpty() && !info[i].mModel.Equals(Model())) { continue; } if (!info[i].mProduct.IsEmpty() && !info[i].mProduct.Equals(Product())) { continue; } if (!info[i].mManufacturer.IsEmpty() && !info[i].mManufacturer.Equals(Manufacturer())) { continue; } #if defined(XP_WIN) || defined(ANDROID) switch (info[i].mComparisonOp) { case DRIVER_LESS_THAN: match = driverVersion < info[i].mDriverVersion; break; case DRIVER_LESS_THAN_OR_EQUAL: match = driverVersion <= info[i].mDriverVersion; break; case DRIVER_GREATER_THAN: match = driverVersion > info[i].mDriverVersion; break; case DRIVER_GREATER_THAN_OR_EQUAL: match = driverVersion >= info[i].mDriverVersion; break; case DRIVER_EQUAL: match = driverVersion == info[i].mDriverVersion; break; case DRIVER_NOT_EQUAL: match = driverVersion != info[i].mDriverVersion; break; case DRIVER_BETWEEN_EXCLUSIVE: match = driverVersion > info[i].mDriverVersion && driverVersion < info[i].mDriverVersionMax; break; case DRIVER_BETWEEN_INCLUSIVE: match = driverVersion >= info[i].mDriverVersion && driverVersion <= info[i].mDriverVersionMax; break; case DRIVER_BETWEEN_INCLUSIVE_START: match = driverVersion >= info[i].mDriverVersion && driverVersion < info[i].mDriverVersionMax; break; case DRIVER_COMPARISON_IGNORED: // We don't have a comparison op, so we match everything. match = true; break; default: NS_WARNING("Bogus op in GfxDriverInfo"); break; } #else // We don't care what driver version it was. We only check OS version and if // the device matches. match = true; #endif if (match || info[i].mDriverVersion == GfxDriverInfo::allDriverVersions) { if (info[i].mFeature == GfxDriverInfo::allFeatures || info[i].mFeature == aFeature) { status = info[i].mFeatureStatus; break; } } } // Depends on Windows driver versioning. We don't pass a GfxDriverInfo object // back to the Windows handler, so we must handle this here. #if defined(XP_WIN) if (status == FEATURE_BLOCKED_DRIVER_VERSION) { if (info[i].mSuggestedVersion) { aSuggestedVersion.AppendPrintf("%s", info[i].mSuggestedVersion); } else if (info[i].mComparisonOp == DRIVER_LESS_THAN && info[i].mDriverVersion != GfxDriverInfo::allDriverVersions) { aSuggestedVersion.AppendPrintf("%lld.%lld.%lld.%lld", (info[i].mDriverVersion & 0xffff000000000000) >> 48, (info[i].mDriverVersion & 0x0000ffff00000000) >> 32, (info[i].mDriverVersion & 0x00000000ffff0000) >> 16, (info[i].mDriverVersion & 0x000000000000ffff)); } }