mirror of
https://github.com/roytam1/basilisk55.git
synced 2026-05-26 15:02:46 +00:00
ported from UXP: [DOM] Update YouTube embed rewrites. (0c2770ff)
This commit is contained in:
@@ -1466,27 +1466,22 @@ nsObjectLoadingContent::MaybeRewriteYoutubeEmbed(nsIURI* aURI, nsIURI* aBaseURI,
|
||||
}
|
||||
|
||||
// See if requester is planning on using the JS API.
|
||||
nsAutoCString uri;
|
||||
nsresult rv = aURI->GetSpec(uri);
|
||||
nsAutoCString prePath;
|
||||
nsresult rv = aURI->GetPrePath(prePath);
|
||||
if (NS_FAILED(rv)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (uri.Find("enablejsapi=1", true, 0, -1) != kNotFound) {
|
||||
Telemetry::Accumulate(Telemetry::YOUTUBE_NONREWRITABLE_EMBED_SEEN, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
// Some YouTube urls have parameters in path components, e.g.
|
||||
// http://youtube.com/embed/7LcUOEP7Brc&start=35. These URLs work with flash,
|
||||
// but break iframe/object embedding. If this situation occurs with rewritten
|
||||
// URLs, convert the parameters to query in order to make the video load
|
||||
// correctly as an iframe. In either case, warn about it in the
|
||||
// developer console.
|
||||
int32_t ampIndex = uri.FindChar('&', 0);
|
||||
int32_t ampIndex = path.FindChar('&', 0);
|
||||
bool replaceQuery = false;
|
||||
if (ampIndex != -1) {
|
||||
int32_t qmIndex = uri.FindChar('?', 0);
|
||||
int32_t qmIndex = path.FindChar('?', 0);
|
||||
if (qmIndex == -1 ||
|
||||
qmIndex > ampIndex) {
|
||||
replaceQuery = true;
|
||||
@@ -1502,20 +1497,22 @@ nsObjectLoadingContent::MaybeRewriteYoutubeEmbed(nsIURI* aURI, nsIURI* aBaseURI,
|
||||
return;
|
||||
}
|
||||
|
||||
nsAutoString utf16OldURI = NS_ConvertUTF8toUTF16(uri);
|
||||
NS_ConvertUTF8toUTF16 utf16OldURI(prePath);
|
||||
AppendUTF8toUTF16(path, utf16OldURI);
|
||||
// If we need to convert the URL, it means an ampersand comes first.
|
||||
// Use the index we found earlier.
|
||||
if (replaceQuery) {
|
||||
// Replace question marks with ampersands.
|
||||
uri.ReplaceChar('?', '&');
|
||||
path.ReplaceChar('?', '&');
|
||||
// Replace the first ampersand with a question mark.
|
||||
uri.SetCharAt('?', ampIndex);
|
||||
path.SetCharAt('?', ampIndex);
|
||||
}
|
||||
// Switch out video access url formats, which should possibly allow HTML5
|
||||
// video loading.
|
||||
uri.ReplaceSubstring(NS_LITERAL_CSTRING("/v/"),
|
||||
NS_LITERAL_CSTRING("/embed/"));
|
||||
nsAutoString utf16URI = NS_ConvertUTF8toUTF16(uri);
|
||||
path.ReplaceSubstring(NS_LITERAL_CSTRING("/v/"),
|
||||
NS_LITERAL_CSTRING("/embed/"));
|
||||
NS_ConvertUTF8toUTF16 utf16URI(prePath);
|
||||
AppendUTF8toUTF16(path, utf16URI);
|
||||
rv = nsContentUtils::NewURIWithDocumentCharset(aOutURI,
|
||||
utf16URI,
|
||||
thisContent->OwnerDoc(),
|
||||
|
||||
@@ -572,12 +572,12 @@ class nsObjectLoadingContent : public nsImageLoadingContent
|
||||
*
|
||||
* - is an embed or object node
|
||||
* - has a URL pointing at the youtube.com domain, using "/v/" style video
|
||||
* path reference, and without enablejsapi=1 in the path
|
||||
* path reference.
|
||||
*
|
||||
* Having the enablejsapi flag means the document that contains the element
|
||||
* could possibly be manipulating the youtube video elsewhere on the page
|
||||
* via javascript. We can't rewrite these kinds of elements without possibly
|
||||
* breaking content, which we want to avoid.
|
||||
* via javascript. In the context of embed elements, this usage has been
|
||||
* deprecated by youtube, so we can just rewrite as normal.
|
||||
*
|
||||
* If we can rewrite the URL, we change the "/v/" to "/embed/", and change
|
||||
* our type to eType_Document so that we render similarly to an iframe
|
||||
|
||||
Reference in New Issue
Block a user