| // Copyright 2021 The Chromium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "components/webapps/renderer/web_page_metadata_agent.h" | |
| #include <stddef.h> | |
| #include <utility> | |
| #include "base/functional/bind.h" | |
| #include "components/webapps/common/constants.h" | |
| #include "components/webapps/common/web_page_metadata.mojom.h" | |
| #include "components/webapps/renderer/web_page_metadata_extraction.h" | |
| #include "content/public/renderer/render_frame.h" | |
| #include "services/service_manager/public/cpp/binder_registry.h" | |
| #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" | |
| #include "third_party/blink/public/web/web_console_message.h" | |
| #include "third_party/blink/public/web/web_local_frame.h" | |
| namespace webapps { | |
| WebPageMetadataAgent::WebPageMetadataAgent(content::RenderFrame* render_frame) | |
| : content::RenderFrameObserver(render_frame) { | |
| render_frame->GetAssociatedInterfaceRegistry() | |
| ->AddInterface<mojom::WebPageMetadataAgent>(base::BindRepeating( | |
| &WebPageMetadataAgent::OnRenderFrameObserverRequest, | |
| base::Unretained(this))); | |
| } | |
| WebPageMetadataAgent::~WebPageMetadataAgent() = default; | |
| void WebPageMetadataAgent::OnInterfaceRequestForFrame( | |
| const std::string& interface_name, | |
| mojo::ScopedMessagePipeHandle* interface_pipe) { | |
| registry_.TryBindInterface(interface_name, interface_pipe); | |
| } | |
| void WebPageMetadataAgent::OnDestruct() { | |
| delete this; | |
| } | |
| void WebPageMetadataAgent::GetWebPageMetadata( | |
| GetWebPageMetadataCallback callback) { | |
| blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); | |
| mojom::WebPageMetadataPtr web_page_metadata = ExtractWebPageMetadata(frame); | |
| // The warning below is specific to mobile but it doesn't hurt to show it even | |
| // if the Chromium build is running on a desktop. It will get more exposition. | |
| if (web_page_metadata->mobile_capable == | |
| mojom::WebPageMobileCapable::ENABLED_APPLE) { | |
| blink::WebConsoleMessage message( | |
| blink::mojom::ConsoleMessageLevel::kWarning, | |
| "<meta name=\"apple-mobile-web-app-capable\" content=\"yes\"> is " | |
| "deprecated. Please include <meta name=\"mobile-web-app-capable\" " | |
| "content=\"yes\">"); | |
| frame->AddMessageToConsole(message); | |
| } | |
| // Prune out any data URLs in the set of icons. The browser process expects | |
| // any icon with a data URL to have originated from a favicon. We don't want | |
| // to decode arbitrary data URLs in the browser process. See | |
| // http://b/issue?id=1162972 | |
| for (auto it = web_page_metadata->icons.begin(); | |
| it != web_page_metadata->icons.end();) { | |
| if ((*it)->url.SchemeIs(url::kDataScheme)) | |
| it = web_page_metadata->icons.erase(it); | |
| else | |
| ++it; | |
| } | |
| // Truncate the strings we send to the browser process. | |
| web_page_metadata->application_name = | |
| web_page_metadata->application_name.substr(0, kMaxMetaTagAttributeLength); | |
| web_page_metadata->description = | |
| web_page_metadata->description.substr(0, kMaxMetaTagAttributeLength); | |
| std::move(callback).Run(std::move(web_page_metadata)); | |
| } | |
| void WebPageMetadataAgent::OnRenderFrameObserverRequest( | |
| mojo::PendingAssociatedReceiver<mojom::WebPageMetadataAgent> receiver) { | |
| receivers_.Add(this, std::move(receiver)); | |
| } | |
| } // namespace webapps |