#include "extensions/browser/browser_frame_context_data.h"
#include <memory>
#include "content/public/browser/isolated_context_util.h"
#include "content/public/browser/isolated_web_apps_policy.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "extensions/browser/extensions_browser_client.h"
#include "services/network/public/mojom/permissions_policy/permissions_policy_feature.mojom-forward.h"
#include "services/network/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h"
namespace extensions {
std::unique_ptr<FrameContextData>
BrowserFrameContextData::CloneFrameContextData() const {
return std::make_unique<BrowserFrameContextData>(frame_);
}
bool BrowserFrameContextData::HasControlledFrameCapability() const {
return frame_ &&
frame_->IsFeatureEnabled(
network::mojom::PermissionsPolicyFeature::kControlledFrame) &&
content::HasIsolatedContextCapability(frame_) &&
ExtensionsBrowserClient::Get()->HasControlledFrameCapability(
frame_->GetBrowserContext(), GetUrl());
}
std::unique_ptr<FrameContextData>
BrowserFrameContextData::GetLocalParentOrOpener() const {
CHECK(frame_);
content::RenderFrameHost* parent_or_opener = frame_->GetParent();
if (!parent_or_opener && frame_->IsInPrimaryMainFrame()) {
parent_or_opener =
content::WebContents::FromRenderFrameHost(frame_)->GetOpener();
}
if (!parent_or_opener) {
return nullptr;
}
if (parent_or_opener->GetProcess() != frame_->GetProcess()) {
return nullptr;
}
return std::make_unique<BrowserFrameContextData>(parent_or_opener);
}
GURL BrowserFrameContextData::GetUrl() const {
CHECK(frame_);
if (frame_->GetLastCommittedURL().is_empty()) {
return GURL(url::kAboutBlankURL);
}
return frame_->GetLastCommittedURL();
}
url::Origin BrowserFrameContextData::GetOrigin() const {
CHECK(frame_);
return frame_->GetLastCommittedOrigin();
}
bool BrowserFrameContextData::CanAccess(const url::Origin& target) const {
NOTREACHED();
}
bool BrowserFrameContextData::CanAccess(const FrameContextData& target) const {
NOTREACHED();
}
uintptr_t BrowserFrameContextData::GetId() const {
CHECK(frame_);
return frame_->GetRoutingID();
}
}