blob: 1417fb9dfc83816b29c34fd27f2d388a5a703644 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_frame_container.h"
#include <string>
#include "content/public/renderer/render_frame.h"
#include "extensions/common/guest_view/mime_handler_view_uma_types.h"
#include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_manager.h"
#include "third_party/blink/public/platform/web_security_origin.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 "third_party/blink/public/web/web_remote_frame.h"
#include "ui/gfx/geometry/size.h"
namespace extensions {
using UMATypes = MimeHandlerViewUMATypes::Type;
MimeHandlerViewFrameContainer::MimeHandlerViewFrameContainer(
MimeHandlerViewContainerManager* container_manager,
const blink::WebElement& plugin_element,
const GURL& resource_url,
const std::string& mime_type)
: container_manager_(container_manager),
plugin_element_(plugin_element),
resource_url_(resource_url),
mime_type_(mime_type),
is_resource_accessible_to_embedder_(
GetSourceFrame()->GetSecurityOrigin().CanAccess(
blink::WebSecurityOrigin::Create(resource_url))) {}
MimeHandlerViewFrameContainer::~MimeHandlerViewFrameContainer() {}
blink::WebLocalFrame* MimeHandlerViewFrameContainer::GetSourceFrame() {
return container_manager_->render_frame()->GetWebFrame();
}
blink::WebFrame* MimeHandlerViewFrameContainer::GetTargetFrame() {
if (!AreFramesValid())
return nullptr;
return GetContentFrame()->FirstChild();
}
bool MimeHandlerViewFrameContainer::IsEmbedded() const {
return true;
}
bool MimeHandlerViewFrameContainer::IsResourceAccessibleBySource() const {
return is_resource_accessible_to_embedder_;
}
blink::WebFrame* MimeHandlerViewFrameContainer::GetContentFrame() const {
return blink::WebFrame::FromFrameOwnerElement(plugin_element_);
}
bool MimeHandlerViewFrameContainer::AreFramesAlive() {
if (!GetContentFrame() || !GetContentFrame()->FirstChild()) {
container_manager_->RemoveFrameContainerForReason(
this, UMATypes::kRemoveFrameContainerUnexpectedFrames);
return false;
}
return true;
}
void MimeHandlerViewFrameContainer::SetRoutingIds(int32_t content_frame_id,
int32_t guest_frame_id) {
DCHECK_EQ(content_frame_id_, MSG_ROUTING_NONE);
DCHECK(!post_message_support()->is_active());
content_frame_id_ = content_frame_id;
guest_frame_id_ = guest_frame_id;
post_message_support()->SetActive();
}
bool MimeHandlerViewFrameContainer::AreFramesValid() {
if (!AreFramesAlive())
return false;
if (content_frame_id_ ==
content::RenderFrame::GetRoutingIdForWebFrame(GetContentFrame())) {
if (guest_frame_id_ == content::RenderFrame::GetRoutingIdForWebFrame(
GetContentFrame()->FirstChild())) {
return true;
}
}
container_manager_->RemoveFrameContainerForReason(
this, UMATypes::kRemoveFrameContainerUnexpectedFrames);
return false;
}
} // namespace extensions