1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
// Copyright 2014 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_GUEST_VIEW_BROWSER_GUEST_VIEW_H_
#define COMPONENTS_GUEST_VIEW_BROWSER_GUEST_VIEW_H_
#include <string_view>
#include "base/metrics/histogram_functions.h"
#include "components/guest_view/browser/guest_view_base.h"
#include "components/guest_view/browser/guest_view_histogram_value.h"
#include "components/guest_view/browser/guest_view_manager.h"
#include "content/public/browser/frame_tree_node_id.h"
#include "content/public/browser/global_routing_id.h"
#include "content/public/browser/render_frame_host.h"
namespace content {
class NavigationHandle;
} // namespace content
namespace guest_view {
// A GuestView is the templated base class for out-of-process frames in the
// chrome layer. GuestView is templated on its derived type to allow for type-
// safe access. See GuestViewBase for more information.
template <typename T>
class GuestView : public GuestViewBase {
public:
static T* FromGuestViewBase(GuestViewBase* guest_view_base) {
return AsDerivedGuest(guest_view_base);
}
static T* FromInstanceID(int embedder_process_id, int guest_instance_id) {
return AsDerivedGuest(
GuestViewBase::FromInstanceID(embedder_process_id, guest_instance_id));
}
static T* FromInstanceID(content::ChildProcessId embedder_process_id,
int guest_instance_id) {
return AsDerivedGuest(
GuestViewBase::FromInstanceID(embedder_process_id, guest_instance_id));
}
// Prefer using FromRenderFrameHost. See https://crbug.com/1362569.
static T* FromWebContents(content::WebContents* contents) {
return AsDerivedGuest(GuestViewBase::FromWebContents(contents));
}
static T* FromRenderFrameHost(content::RenderFrameHost* rfh) {
return AsDerivedGuest(GuestViewBase::FromRenderFrameHost(rfh));
}
static T* FromRenderFrameHostId(
const content::GlobalRenderFrameHostId& rfh_id) {
return AsDerivedGuest(GuestViewBase::FromRenderFrameHostId(rfh_id));
}
static T* FromNavigationHandle(content::NavigationHandle* navigation_handle) {
return AsDerivedGuest(
GuestViewBase::FromNavigationHandle(navigation_handle));
}
static T* FromFrameTreeNodeId(content::FrameTreeNodeId frame_tree_node_id) {
return AsDerivedGuest(
GuestViewBase::FromFrameTreeNodeId(frame_tree_node_id));
}
GuestView(const GuestView&) = delete;
GuestView& operator=(const GuestView&) = delete;
// GuestViewBase implementation.
std::string_view GetViewType() const final { return T::Type; }
protected:
explicit GuestView(content::RenderFrameHost* owner_rfh)
: GuestViewBase(owner_rfh) {
LogUsage();
}
~GuestView() override = default;
T* GetOpener() const { return AsDerivedGuest(GuestViewBase::GetOpener()); }
void SetOpener(T* opener) { GuestViewBase::SetOpener(opener); }
private:
// Downcasts to a *ViewGuest if the GuestViewBase is of the derived view type.
// Otherwise, returns nullptr.
static T* AsDerivedGuest(GuestViewBase* guest) {
if (!guest) {
return nullptr;
}
if (guest->GetViewType() != T::Type) {
return nullptr;
}
return static_cast<T*>(guest);
}
void LogUsage() {
GuestViewHistogramValue value = T::HistogramValue;
if (value == GuestViewHistogramValue::kWebView &&
IsOwnedByControlledFrameEmbedder()) {
value = GuestViewHistogramValue::kControlledFrame;
}
base::UmaHistogramEnumeration("GuestView.GuestViewCreated", value);
}
};
} // namespace guest_view
#endif // COMPONENTS_GUEST_VIEW_BROWSER_GUEST_VIEW_H_
|