blob: d505c984f0682f4f3067dc80d5f51ff2f91180fa [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_OPTIMIZATION_GUIDE_CONTENT_BROWSER_PAGE_CONTENT_METADATA_OBSERVER_H_
#define COMPONENTS_OPTIMIZATION_GUIDE_CONTENT_BROWSER_PAGE_CONTENT_METADATA_OBSERVER_H_
#include <memory>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "third_party/blink/public/mojom/content_extraction/frame_metadata_observer_registry.mojom.h"
namespace content {
class Page;
class RenderFrameHost;
class WebContents;
} // namespace content
namespace optimization_guide {
// A class that is responsible for observing metadata for all frames in a
// WebContents. For each remote frame, it will register a MetaTagsObserver to
// receive metadata from the frame.
//
// This class currently only supports a single observer and set of names. Each
// consumer should create a separate instance of this class to observe metadata
// for a set of meta tags.
class PageContentMetadataObserver : public content::WebContentsObserver {
public:
using OnPageMetadataChangedCallback =
base::RepeatingCallback<void(const blink::mojom::PageMetadata&)>;
PageContentMetadataObserver(content::WebContents* web_contents,
const std::vector<std::string>& names,
OnPageMetadataChangedCallback callback);
~PageContentMetadataObserver() override;
PageContentMetadataObserver(const PageContentMetadataObserver&) = delete;
PageContentMetadataObserver& operator=(const PageContentMetadataObserver&) =
delete;
private:
// content::WebContentsObserver:
void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
void PrimaryPageChanged(content::Page& page) override;
void OnMetaTagsChangedForFrame(
content::RenderFrameHost* render_frame_host,
std::vector<blink::mojom::MetaTagPtr> meta_tags);
void UpdateFrameObservers();
// The implementation of MetaTagsObserver that will be registered with each
// frame.
class FrameMetaTagsObserver : public blink::mojom::MetaTagsObserver {
public:
FrameMetaTagsObserver(
PageContentMetadataObserver* owner,
content::RenderFrameHost* render_frame_host,
mojo::PendingReceiver<blink::mojom::MetaTagsObserver> receiver);
~FrameMetaTagsObserver() override;
// blink::mojom::MetaTagsObserver:
void OnMetaTagsChanged(
std::vector<::blink::mojom::MetaTagPtr> meta_tags) override;
raw_ptr<PageContentMetadataObserver> owner_;
raw_ptr<content::RenderFrameHost> render_frame_host_;
mojo::Receiver<blink::mojom::MetaTagsObserver> receiver_;
};
struct FrameData {
explicit FrameData(std::unique_ptr<FrameMetaTagsObserver> observer);
~FrameData();
FrameData(FrameData&&);
FrameData& operator=(FrameData&&);
std::unique_ptr<FrameMetaTagsObserver> observer;
blink::mojom::FrameMetadataPtr metadata;
};
const std::vector<std::string> names_;
base::flat_map<content::RenderFrameHost*, FrameData> frame_data_;
OnPageMetadataChangedCallback callback_;
};
} // namespace optimization_guide
#endif // COMPONENTS_OPTIMIZATION_GUIDE_CONTENT_BROWSER_PAGE_CONTENT_METADATA_OBSERVER_H_