web_page_metadata_agent.cc 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/webapps/renderer/web_page_metadata_agent.h"
  5. #include <stddef.h>
  6. #include <utility>
  7. #include "base/bind.h"
  8. #include "components/webapps/common/constants.h"
  9. #include "components/webapps/common/web_page_metadata.mojom.h"
  10. #include "components/webapps/renderer/web_page_metadata_extraction.h"
  11. #include "content/public/renderer/render_frame.h"
  12. #include "services/service_manager/public/cpp/binder_registry.h"
  13. #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
  14. #include "third_party/blink/public/web/web_console_message.h"
  15. #include "third_party/blink/public/web/web_local_frame.h"
  16. namespace webapps {
  17. WebPageMetadataAgent::WebPageMetadataAgent(content::RenderFrame* render_frame)
  18. : content::RenderFrameObserver(render_frame) {
  19. render_frame->GetAssociatedInterfaceRegistry()
  20. ->AddInterface<mojom::WebPageMetadataAgent>(base::BindRepeating(
  21. &WebPageMetadataAgent::OnRenderFrameObserverRequest,
  22. base::Unretained(this)));
  23. }
  24. WebPageMetadataAgent::~WebPageMetadataAgent() = default;
  25. void WebPageMetadataAgent::OnInterfaceRequestForFrame(
  26. const std::string& interface_name,
  27. mojo::ScopedMessagePipeHandle* interface_pipe) {
  28. registry_.TryBindInterface(interface_name, interface_pipe);
  29. }
  30. void WebPageMetadataAgent::OnDestruct() {
  31. delete this;
  32. }
  33. void WebPageMetadataAgent::GetWebPageMetadata(
  34. GetWebPageMetadataCallback callback) {
  35. blink::WebLocalFrame* frame = render_frame()->GetWebFrame();
  36. mojom::WebPageMetadataPtr web_page_metadata = ExtractWebPageMetadata(frame);
  37. // The warning below is specific to mobile but it doesn't hurt to show it even
  38. // if the Chromium build is running on a desktop. It will get more exposition.
  39. if (web_page_metadata->mobile_capable ==
  40. mojom::WebPageMobileCapable::ENABLED_APPLE) {
  41. blink::WebConsoleMessage message(
  42. blink::mojom::ConsoleMessageLevel::kWarning,
  43. "<meta name=\"apple-mobile-web-app-capable\" content=\"yes\"> is "
  44. "deprecated. Please include <meta name=\"mobile-web-app-capable\" "
  45. "content=\"yes\">");
  46. frame->AddMessageToConsole(message);
  47. }
  48. // Prune out any data URLs in the set of icons. The browser process expects
  49. // any icon with a data URL to have originated from a favicon. We don't want
  50. // to decode arbitrary data URLs in the browser process. See
  51. // http://b/issue?id=1162972
  52. for (auto it = web_page_metadata->icons.begin();
  53. it != web_page_metadata->icons.end();) {
  54. if ((*it)->url.SchemeIs(url::kDataScheme))
  55. it = web_page_metadata->icons.erase(it);
  56. else
  57. ++it;
  58. }
  59. // Truncate the strings we send to the browser process.
  60. web_page_metadata->application_name =
  61. web_page_metadata->application_name.substr(0, kMaxMetaTagAttributeLength);
  62. web_page_metadata->description =
  63. web_page_metadata->description.substr(0, kMaxMetaTagAttributeLength);
  64. std::move(callback).Run(std::move(web_page_metadata));
  65. }
  66. void WebPageMetadataAgent::OnRenderFrameObserverRequest(
  67. mojo::PendingAssociatedReceiver<mojom::WebPageMetadataAgent> receiver) {
  68. receivers_.Add(this, std::move(receiver));
  69. }
  70. } // namespace webapps