Bug 1112761 part 2. Enable MediaSource based on a whitelist, not in general. r=kinetik

This commit is contained in:
Boris Zbarsky 2015-01-08 11:57:11 -05:00
parent 6024b51a6b
commit 5e876aa4a5
14 changed files with 88 additions and 13 deletions

View File

@ -19,10 +19,14 @@
#include "mozilla/dom/TimeRanges.h"
#include "mozilla/mozalloc.h"
#include "nsContentTypeParser.h"
#include "nsContentUtils.h"
#include "nsDebug.h"
#include "nsError.h"
#include "nsIEffectiveTLDService.h"
#include "nsIRunnable.h"
#include "nsIScriptObjectPrincipal.h"
#include "nsIURI.h"
#include "nsNetCID.h"
#include "nsPIDOMWindow.h"
#include "nsString.h"
#include "nsThreadUtils.h"
@ -309,7 +313,44 @@ MediaSource::IsTypeSupported(const GlobalObject&, const nsAString& aType)
/* static */ bool
MediaSource::Enabled(JSContext* cx, JSObject* aGlobal)
{
return Preferences::GetBool("media.mediasource.enabled");
MOZ_ASSERT(NS_IsMainThread());
// Don't use aGlobal across Preferences stuff, which the static
// analysis thinks can GC.
JS::Rooted<JSObject*> global(cx, aGlobal);
bool enabled = Preferences::GetBool("media.mediasource.enabled");
if (!enabled) {
return false;
}
// Check whether it's enabled everywhere or just YouTube.
bool restrict = Preferences::GetBool("media.mediasource.youtubeonly", false);
if (!restrict) {
return true;
}
// We want to restrict to YouTube only. We define that as the
// origin being https://*.youtube.com.
nsIPrincipal* principal = nsContentUtils::ObjectPrincipal(global);
nsCOMPtr<nsIURI> uri;
if (NS_FAILED(principal->GetURI(getter_AddRefs(uri))) || !uri) {
return false;
}
bool isHttps = false;
if (NS_FAILED(uri->SchemeIs("https", &isHttps)) || !isHttps) {
return false;
}
nsCOMPtr<nsIEffectiveTLDService> tldServ =
do_GetService(NS_EFFECTIVETLDSERVICE_CONTRACTID);
NS_ENSURE_TRUE(tldServ, false);
nsAutoCString eTLDplusOne;
return
NS_SUCCEEDED(tldServ->GetBaseDomain(uri, 0, eTLDplusOne)) &&
eTLDplusOne.EqualsLiteral("youtube.com");
}
bool

View File

@ -6,6 +6,7 @@
/*
user_pref("media.mediasource.enabled", true);
user_pref("media.mediasource.youtubeonly", false);
*/
function boom()

View File

@ -5,6 +5,7 @@
/*
user_pref("media.mediasource.enabled", true);
user_pref("media.mediasource.youtubeonly", false);
*/
function boom()

View File

@ -1,4 +1,4 @@
test-pref(media.mediasource.enabled,true) load 926665.html
test-pref(media.mediasource.enabled,true) load 931388.html
test-pref(media.mediasource.enabled,true) load 1005366.html
test-pref(media.mediasource.enabled,true) load 1059035.html
test-pref(media.mediasource.enabled,true) test-pref(media.mediasource.youtubeonly,false) load 926665.html
test-pref(media.mediasource.enabled,true) test-pref(media.mediasource.youtubeonly,false) load 931388.html
test-pref(media.mediasource.enabled,true) test-pref(media.mediasource.youtubeonly,false) load 1005366.html
test-pref(media.mediasource.enabled,true) test-pref(media.mediasource.youtubeonly,false) load 1059035.html

View File

@ -17,7 +17,10 @@ function runWithMSE(testFunction) {
}
addLoadEvent(function () {
SpecialPowers.pushPrefEnv({"set": [[ "media.mediasource.enabled", true ]]},
SpecialPowers.pushPrefEnv({"set": [
[ "media.mediasource.enabled", true ],
[ "media.mediasource.youtubeonly", false ],
]},
bootstrapTest);
});
}

View File

@ -19,7 +19,12 @@ function test() {
SimpleTest.finish();
}
SpecialPowers.pushPrefEnv({"set": [["media.mediasource.enabled", false]]},
SpecialPowers.pushPrefEnv({"set":
[
["media.mediasource.enabled", false],
["media.mediasource.youtubeonly", false],
]
},
test);
</script>

View File

@ -51,7 +51,12 @@ function test() {
}
addLoadEvent(function() {
SpecialPowers.pushPrefEnv({"set": [["media.mediasource.enabled", true]]}, test);
SpecialPowers.pushPrefEnv({"set":
[
["media.mediasource.enabled", true],
["media.mediasource.youtubeonly", false],
]
}, test);
});
</script>
</pre>

View File

@ -25,7 +25,12 @@ function test() {
}
addLoadEvent(function() {
SpecialPowers.pushPrefEnv({"set": [["media.mediasource.enabled", false]]}, test);
SpecialPowers.pushPrefEnv({"set":
[
["media.mediasource.enabled", false],
["media.mediasource.youtubeonly", false],
]
}, test);
});
</script>
</pre>

View File

@ -49,6 +49,7 @@ function beginTest() {
var prefs = [
[ "media.mediasource.enabled", true ],
[ "media.mediasource.youtubeonly", false ],
[ "media.mediasource.mp4.enabled", true ],
];

View File

@ -92,6 +92,7 @@ function beginTest() {
var prefs = [
[ "media.mediasource.enabled", true ],
[ "media.mediasource.youtubeonly", false ],
[ "media.mediasource.mp4.enabled", true ],
];

View File

@ -274,6 +274,7 @@ function beginTest() {
var prefs = [
[ "media.mediasource.enabled", true ],
[ "media.mediasource.youtubeonly", false ],
[ "media.mediasource.mp4.enabled", true ],
];

View File

@ -81,6 +81,7 @@ function beginTest() {
var prefs = [
[ "media.mediasource.enabled", true ],
[ "media.mediasource.youtubeonly", false ],
[ "media.mediasource.mp4.enabled", true ],
];

View File

@ -428,13 +428,22 @@ pref("media.webvtt.regions.enabled", false);
// AudioTrack and VideoTrack support
pref("media.track.enabled", false);
// Whether to enable MediaSource support
#ifdef RELEASE_BUILD
pref("media.mediasource.enabled", false);
#else
// Whether to enable MediaSource support. We want to enable on non-release
// builds and on release windows, but on release builds restrict to YouTube. We
// don't enable for YouTube on non-Windows for now because the MP4 code for
// those platforms isn't ready yet.
#if defined(XP_WIN) || !defined(RELEASE_BUILD)
pref("media.mediasource.enabled", true);
#else
pref("media.mediasource.enabled", false);
#endif
#ifdef RELEASE_BUILD
pref("media.mediasource.youtubeonly", true);
#else
pref("media.mediasource.youtubeonly", false);
#endif // RELEASE_BUILD
#ifdef MOZ_WIDGET_GONK
pref("media.mediasource.mp4.enabled", false);
pref("media.mediasource.webm.enabled", false);

View File

@ -157,6 +157,7 @@ user_pref("layout.spammy_warnings.enabled", false);
// Enable Media Source Extensions for testing
user_pref("media.mediasource.enabled", true);
user_pref("media.mediasource.youtubeonly", false);
user_pref("media.mediasource.mp4.enabled", true);
user_pref("media.mediasource.webm.enabled", true);