ported from UXP: [DOM] Update YouTube embed rewrites. (0c2770ff)

This commit is contained in:
2025-06-28 07:07:28 +08:00
parent c1bbbdea8e
commit a455f5736a
2 changed files with 15 additions and 18 deletions
+12 -15
View File
@@ -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(),
+3 -3
View File
@@ -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