#include "extensions/renderer/renderer_frame_context_data.h"
#include "third_party/blink/public/platform/web_security_origin.h"
#include "third_party/blink/public/platform/web_url.h"
#include "third_party/blink/public/web/blink.h"
#include "third_party/blink/public/web/web_document.h"
#include "third_party/blink/public/web/web_frame.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace extensions {
std::unique_ptr<ContextData> RendererFrameContextData::Clone() const {
return CloneFrameContextData();
}
std::unique_ptr<FrameContextData>
RendererFrameContextData::CloneFrameContextData() const {
return std::make_unique<RendererFrameContextData>(frame_);
}
bool RendererFrameContextData::IsIsolatedApplication() const {
return blink::IsIsolatedContext();
}
std::unique_ptr<FrameContextData>
RendererFrameContextData::GetLocalParentOrOpener() const {
CHECK(frame_);
blink::WebFrame* parent_or_opener = nullptr;
if (frame_->Parent()) {
parent_or_opener = frame_->Parent();
} else {
parent_or_opener = frame_->Opener();
}
if (!parent_or_opener || !parent_or_opener->IsWebLocalFrame()) {
return nullptr;
}
blink::WebLocalFrame* local_parent_or_opener =
parent_or_opener->ToWebLocalFrame();
if (local_parent_or_opener->GetDocument().IsNull()) {
return nullptr;
}
return std::make_unique<RendererFrameContextData>(local_parent_or_opener);
}
GURL RendererFrameContextData::GetUrl() const {
CHECK(frame_);
if (frame_->GetDocument().Url().IsEmpty()) {
return GURL(url::kAboutBlankURL);
}
return frame_->GetDocument().Url();
}
url::Origin RendererFrameContextData::GetOrigin() const {
CHECK(frame_);
return frame_->GetSecurityOrigin();
}
bool RendererFrameContextData::CanAccess(const url::Origin& target) const {
CHECK(frame_);
return frame_->GetSecurityOrigin().CanAccess(target);
}
bool RendererFrameContextData::CanAccess(const FrameContextData& target) const {
CHECK(frame_);
const blink::WebLocalFrame* target_frame =
static_cast<const RendererFrameContextData&>(target).frame_;
CHECK(target_frame);
blink::WebSecurityOrigin web_security_origin =
target_frame->GetDocument().GetSecurityOrigin();
return frame_->GetSecurityOrigin().CanAccess(web_security_origin);
}
uintptr_t RendererFrameContextData::GetId() const {
CHECK(frame_);
return reinterpret_cast<uintptr_t>(frame_);
}
}