static MediaKeySystemStatus EnsureMinCDMVersion(mozIGeckoMediaPluginService* aGMPService, const nsAString& aKeySystem, int32_t aMinCdmVersion, nsACString& aOutMessage, nsACString& aOutCdmVersion) { nsTArray<nsCString> tags; tags.AppendElement(NS_ConvertUTF16toUTF8(aKeySystem)); bool hasPlugin; nsAutoCString versionStr; if (NS_FAILED(aGMPService->GetPluginVersionForAPI(NS_LITERAL_CSTRING(GMP_API_DECRYPTOR), &tags, &hasPlugin, versionStr))) { aOutMessage = NS_LITERAL_CSTRING("GetPluginVersionForAPI failed"); return MediaKeySystemStatus::Error; } aOutCdmVersion = versionStr; if (!hasPlugin) { aOutMessage = NS_LITERAL_CSTRING("CDM is not installed"); return MediaKeySystemStatus::Cdm_not_installed; } #ifdef XP_WIN if (aKeySystem.EqualsLiteral("com.adobe.primetime")) { // Verify that anti-virus hasn't "helpfully" deleted the Adobe GMP DLL, // as we suspect may happen (Bug 1160382). bool somethingMissing = false; if (!AdobePluginDLLExists(versionStr)) { aOutMessage = NS_LITERAL_CSTRING("Adobe DLL was expected to be on disk but was not"); somethingMissing = true; } if (!AdobePluginVoucherExists(versionStr)) { aOutMessage = NS_LITERAL_CSTRING("Adobe plugin voucher was expected to be on disk but was not"); somethingMissing = true; } if (somethingMissing) { NS_WARNING("Adobe EME plugin or voucher disappeared from disk!"); // Reset the prefs that Firefox's GMP downloader sets, so that // Firefox will try to download the plugin next time the updater runs. Preferences::ClearUser("media.gmp-eme-adobe.lastUpdate"); Preferences::ClearUser("media.gmp-eme-adobe.version"); return MediaKeySystemStatus::Cdm_not_installed; } } #endif nsresult rv; int32_t version = versionStr.ToInteger(&rv); if (aMinCdmVersion != NO_CDM_VERSION && (NS_FAILED(rv) || version < 0 || aMinCdmVersion > version)) { aOutMessage = NS_LITERAL_CSTRING("Installed CDM version insufficient"); return MediaKeySystemStatus::Cdm_insufficient_version; } return MediaKeySystemStatus::Available; }
/* static */ bool MediaKeySystemAccess::IsGMPPresentOnDisk(const nsAString& aKeySystem, const nsACString& aVersion, nsACString& aOutMessage) { MOZ_ASSERT(NS_IsMainThread()); if (XRE_GetProcessType() != GeckoProcessType_Default) { // We need to be able to access the filesystem, so call this in the // main process via ContentChild. ContentChild* contentChild = ContentChild::GetSingleton(); if (NS_WARN_IF(!contentChild)) { return false; } nsCString message; bool result = false; bool ok = contentChild->SendIsGMPPresentOnDisk(nsString(aKeySystem), nsCString(aVersion), &result, &message); aOutMessage = message; return ok && result; } bool isPresent = true; #if XP_WIN if (aKeySystem.EqualsLiteral("com.adobe.primetime")) { if (!AdobePluginDLLExists(aVersion)) { NS_WARNING("Adobe EME plugin disappeared from disk!"); aOutMessage = NS_LITERAL_CSTRING("Adobe DLL was expected to be on disk but was not"); isPresent = false; } if (!AdobePluginVoucherExists(aVersion)) { NS_WARNING("Adobe EME voucher disappeared from disk!"); aOutMessage = NS_LITERAL_CSTRING("Adobe plugin voucher was expected to be on disk but was not"); isPresent = false; } if (!isPresent) { // Reset the prefs that Firefox's GMP downloader sets, so that // Firefox will try to download the plugin next time the updater runs. Preferences::ClearUser("media.gmp-eme-adobe.lastUpdate"); Preferences::ClearUser("media.gmp-eme-adobe.version"); } else if (!EMEVoucherFileExists()) { // Gecko doesn't have a voucher file for the plugin-container. // Adobe EME isn't going to work, so don't advertise that it will. aOutMessage = NS_LITERAL_CSTRING("Plugin-container voucher not present"); isPresent = false; } } #endif return isPresent; }