#include "chrome/renderer/media/media_feeds.h"
#include "base/strings/string_util.h"
#include "content/public/renderer/render_frame.h"
#include "third_party/blink/public/platform/web_security_origin.h"
#include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/platform/web_url.h"
#include "third_party/blink/public/web/web_console_message.h"
#include "third_party/blink/public/web/web_document.h"
#include "third_party/blink/public/web/web_element.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "third_party/blink/public/web/web_node.h"
#include "url/gurl.h"
using blink::WebDocument;
using blink::WebElement;
using blink::WebNode;
using blink::WebString;
std::optional<GURL> MediaFeeds::GetMediaFeedURL(content::RenderFrame* frame) {
if (!frame->IsMainFrame())
return std::nullopt;
WebDocument document = frame->GetWebFrame()->GetDocument();
if (document.IsNull())
return std::nullopt;
WebElement head = document.Head();
if (head.IsNull())
return std::nullopt;
url::Origin document_origin = document.GetSecurityOrigin();
for (WebNode child = head.FirstChild(); !child.IsNull();
child = child.NextSibling()) {
if (!child.IsElementNode())
continue;
WebElement elem = child.To<WebElement>();
if (!elem.HasHTMLTagName("link"))
continue;
std::string rel = elem.GetAttribute("rel").Utf8();
if (!base::EqualsCaseInsensitiveASCII(rel, "media-feed"))
continue;
WebString href = elem.GetAttribute("href");
if (href.IsNull() || href.IsEmpty())
continue;
GURL url = document.CompleteURL(href);
if (!url.is_valid()) {
frame->AddMessageToConsole(blink::mojom::ConsoleMessageLevel::kWarning,
"The Media Feed URL is not a valid URL.");
return std::nullopt;
}
if (!document_origin.IsSameOriginWith(url)) {
frame->AddMessageToConsole(blink::mojom::ConsoleMessageLevel::kWarning,
"The Media Feed URL needs to be the same "
"origin as the document URL.");
return std::nullopt;
}
return url;
}
return std::nullopt;
}