Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(192)

Unified Diff: extensions/browser/guest_view/web_view/web_view_guest.cc

Issue 2182633007: Avoid using ContentBrowserClient::IsIllegalOrigin in ResourceDispatcherHost. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix compile failures Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: extensions/browser/guest_view/web_view/web_view_guest.cc
diff --git a/extensions/browser/guest_view/web_view/web_view_guest.cc b/extensions/browser/guest_view/web_view/web_view_guest.cc
index 6e9751d58915840ce32264c05dd672774c9c1a59..67210b870cd0a4132309060fe0e7822f6f142770 100644
--- a/extensions/browser/guest_view/web_view/web_view_guest.cc
+++ b/extensions/browser/guest_view/web_view/web_view_guest.cc
@@ -31,6 +31,7 @@
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/render_widget_host.h"
#include "content/public/browser/render_widget_host_view.h"
+#include "content/public/browser/resource_dispatcher_host.h"
#include "content/public/browser/resource_request_details.h"
#include "content/public/browser/site_instance.h"
#include "content/public/browser/storage_partition.h"
@@ -52,8 +53,8 @@
#include "extensions/browser/guest_view/web_view/web_view_content_script_manager.h"
#include "extensions/browser/guest_view/web_view/web_view_permission_helper.h"
#include "extensions/browser/guest_view/web_view/web_view_permission_types.h"
-#include "extensions/browser/guest_view/web_view/web_view_renderer_state.h"
#include "extensions/common/constants.h"
+#include "extensions/common/extension.h"
#include "extensions/common/extension_messages.h"
#include "extensions/common/manifest_constants.h"
#include "extensions/strings/grit/extensions_strings.h"
@@ -932,13 +933,12 @@ void WebViewGuest::PushWebViewStateToIOThread() {
web_view_info.embedder_process_id, web_view_info.instance_id);
content::BrowserThread::PostTask(
- content::BrowserThread::IO,
- FROM_HERE,
- base::Bind(&WebViewRendererState::AddGuest,
+ content::BrowserThread::IO, FROM_HERE,
+ base::Bind(&WebViewGuest::AddGuestHelper,
base::Unretained(WebViewRendererState::GetInstance()),
web_contents()->GetRenderProcessHost()->GetID(),
- web_contents()->GetRoutingID(),
- web_view_info));
+ web_contents()->GetRoutingID(), web_view_info,
+ browser_context()->GetResourceContext()));
}
// static
@@ -946,11 +946,11 @@ void WebViewGuest::RemoveWebViewStateFromIOThread(
WebContents* web_contents) {
content::BrowserThread::PostTask(
content::BrowserThread::IO, FROM_HERE,
- base::Bind(
- &WebViewRendererState::RemoveGuest,
- base::Unretained(WebViewRendererState::GetInstance()),
- web_contents->GetRenderProcessHost()->GetID(),
- web_contents->GetRoutingID()));
+ base::Bind(&WebViewGuest::RemoveGuestHelper,
+ base::Unretained(WebViewRendererState::GetInstance()),
+ web_contents->GetRenderProcessHost()->GetID(),
+ web_contents->GetRoutingID(),
+ web_contents->GetBrowserContext()->GetResourceContext()));
}
void WebViewGuest::RequestMediaAccessPermission(
@@ -1503,4 +1503,51 @@ void WebViewGuest::SetFullscreenState(bool is_fullscreen) {
web_contents()->GetRenderViewHost()->GetWidget()->WasResized();
}
+// static
+void WebViewGuest::AddGuestHelper(
+ WebViewRendererState* renderer_state,
+ int guest_process_id,
+ int guest_routing_id,
+ const WebViewRendererState::WebViewInfo& web_view_info,
+ const content::ResourceContext* context) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+ // Guest processes can access resources from the host (extensions). The
+ // ResourceDispatcherHost object performs access checks for certain origins
+ // like extensions when they are requested. We should inform the
+ // ResourceDispatcherHost instance about guests so it can enforce accesses
+ // correctly. This should be done only for new guest processes.
+ bool new_guest = !renderer_state->IsGuest(guest_process_id);
+ renderer_state->AddGuest(guest_process_id, guest_routing_id, web_view_info);
+ if (new_guest) {
+ DCHECK(content::ResourceDispatcherHost::Get());
+ content::ResourceDispatcherHost::Get()->AddGuestForOrigin(
+ context,
+ Extension::GetBaseURLFromExtensionId(web_view_info.owner_host).spec(),
+ guest_process_id);
jam 2016/08/01 20:06:01 nit: it would be shorter to read this code if ther
ananta 2016/08/02 00:40:50 Leaving this as is. I wanted to avoid two PostTask
+ }
+}
+
+// static
+void WebViewGuest::RemoveGuestHelper(WebViewRendererState* renderer_state,
+ int guest_process_id,
+ int guest_routing_id,
+ const content::ResourceContext* context) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+
+ std::string owner_id;
+ renderer_state->GetOwnerInfo(guest_process_id, nullptr, &owner_id);
+
+ renderer_state->RemoveGuest(guest_process_id, guest_routing_id);
+ // If this is no longer a guest process, then inform the
+ // ResourceDispatcherHost accordingly so it can enforce accesses correctly.
+ if (!renderer_state->IsGuest(guest_process_id)) {
+ DCHECK(content::ResourceDispatcherHost::Get());
+ content::ResourceDispatcherHost::Get()->RemoveGuestForOrigin(
+ context,
+ Extension::GetBaseURLFromExtensionId(owner_id).spec(),
+ guest_process_id);
+ }
+}
+
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698