// Copyright 2014 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 "content/browser/plugin_content_origin_allowlist.h" #include "content/browser/renderer_host/render_view_host_impl.h" #include "content/common/frame_messages.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" namespace content { PluginContentOriginAllowlist::DocumentPluginContentOriginAllowlist:: ~DocumentPluginContentOriginAllowlist() {} PluginContentOriginAllowlist::DocumentPluginContentOriginAllowlist:: DocumentPluginContentOriginAllowlist(RenderFrameHost* render_frame_host) {} void PluginContentOriginAllowlist::DocumentPluginContentOriginAllowlist:: InsertOrigin(const url::Origin& content_origin) { origins_.insert(content_origin); } RENDER_DOCUMENT_HOST_USER_DATA_KEY_IMPL( PluginContentOriginAllowlist::DocumentPluginContentOriginAllowlist) PluginContentOriginAllowlist::PluginContentOriginAllowlist( WebContents* web_contents) : WebContentsObserver(web_contents) {} PluginContentOriginAllowlist::~PluginContentOriginAllowlist() {} void PluginContentOriginAllowlist::RenderFrameCreated( RenderFrameHost* render_frame_host) { // When RenderFrame is created inside the main frame, DocumentPluginContentOriginAllowlist* allowlist = DocumentPluginContentOriginAllowlist::GetForCurrentDocument( render_frame_host->GetMainFrame()); if (!allowlist || allowlist->origins().empty()) return; render_frame_host->Send(new FrameMsg_UpdatePluginContentOriginAllowlist( render_frame_host->GetRoutingID(), allowlist->origins())); } bool PluginContentOriginAllowlist::OnMessageReceived( const IPC::Message& message, RenderFrameHost* render_frame_host) { bool handled = true; IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(PluginContentOriginAllowlist, message, render_frame_host) IPC_MESSAGE_HANDLER(FrameHostMsg_PluginContentOriginAllowed, OnPluginContentOriginAllowed) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; } void PluginContentOriginAllowlist::OnPluginContentOriginAllowed( RenderFrameHost* render_frame_host, const url::Origin& content_origin) { DocumentPluginContentOriginAllowlist* allowlist = DocumentPluginContentOriginAllowlist::GetOrCreateForCurrentDocument( render_frame_host->GetMainFrame()); allowlist->InsertOrigin(content_origin); // TODO(yuzus, crbug.com/1061899): This message should be sent to all the // frames in the same frame tree as |render_frame_host|. When mojofying this // IPC, this should use PageBroadcast interface and look up the correct set of // RenderViewHosts from |render_frame_host| instead of getting them from // |web_contents()|. web_contents()->SendToAllFrames( new FrameMsg_UpdatePluginContentOriginAllowlist(MSG_ROUTING_NONE, allowlist->origins())); } bool PluginContentOriginAllowlist::IsOriginAllowlistedForFrameForTesting( RenderFrameHost* render_frame_host, const url::Origin& content_origin) { DocumentPluginContentOriginAllowlist* allowlist = DocumentPluginContentOriginAllowlist::GetForCurrentDocument( render_frame_host->GetMainFrame()); PluginContentOriginAllowlist::DocumentPluginContentOriginAllowlist:: GetForCurrentDocument(render_frame_host->GetMainFrame()); if (!allowlist) return false; return allowlist->origins().find(content_origin) != allowlist->origins().end(); } } // namespace content