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

Side by Side Diff: extensions/browser/extension_navigation_throttle.cc

Issue 2841413003: ExtensionNavigationThrottle: block extension iframes in platform apps. (Closed)
Patch Set: Merge branch 'kill_107_reboot2_s' into kill_107_reboot3' Created 3 years, 7 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "extensions/browser/extension_navigation_throttle.h" 5 #include "extensions/browser/extension_navigation_throttle.h"
6 6
7 #include "components/guest_view/browser/guest_view_base.h" 7 #include "components/guest_view/browser/guest_view_base.h"
8 #include "content/public/browser/browser_thread.h" 8 #include "content/public/browser/browser_thread.h"
9 #include "content/public/browser/navigation_handle.h" 9 #include "content/public/browser/navigation_handle.h"
10 #include "content/public/browser/render_frame_host.h" 10 #include "content/public/browser/render_frame_host.h"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 is_guest, target_extension, owner_extension, partition_id, url.path(), 105 is_guest, target_extension, owner_extension, partition_id, url.path(),
106 navigation_handle()->GetPageTransition(), &allowed); 106 navigation_handle()->GetPageTransition(), &allowed);
107 if (!allowed) 107 if (!allowed)
108 return content::NavigationThrottle::BLOCK_REQUEST; 108 return content::NavigationThrottle::BLOCK_REQUEST;
109 } 109 }
110 110
111 return content::NavigationThrottle::PROCEED; 111 return content::NavigationThrottle::PROCEED;
112 } 112 }
113 113
114 // This is a subframe navigation to a |target_extension| resource. 114 // This is a subframe navigation to a |target_extension| resource.
115 // Enforce the web_accessible_resources restriction. 115 // Enforce the web_accessible_resources restriction, and same-origin
116 // restrictions for platform apps.
116 content::RenderFrameHost* parent = navigation_handle()->GetParentFrame(); 117 content::RenderFrameHost* parent = navigation_handle()->GetParentFrame();
117 118
118 // Look to see if all ancestors belong to |target_extension|. If not, 119 // Look to see if all ancestors belong to |target_extension|. If not,
119 // then the web_accessible_resource restriction applies. 120 // then the web_accessible_resource restriction applies.
120 bool external_ancestor = false; 121 bool external_ancestor = false;
121 for (auto* ancestor = parent; ancestor; ancestor = ancestor->GetParent()) { 122 for (auto* ancestor = parent; ancestor; ancestor = ancestor->GetParent()) {
122 // Look for a match on the last committed origin. This handles the 123 // Look for a match on the last committed origin. This handles the
123 // common case, and the about:blank case. 124 // common case, and the about:blank case.
124 if (ancestor->GetLastCommittedOrigin() == target_origin) 125 if (ancestor->GetLastCommittedOrigin() == target_origin)
125 continue; 126 continue;
(...skipping 15 matching lines...) Expand all
141 142
142 if (external_ancestor) { 143 if (external_ancestor) {
143 // Cancel navigations to nested URLs, to match the main frame behavior. 144 // Cancel navigations to nested URLs, to match the main frame behavior.
144 if (!url_has_extension_scheme) 145 if (!url_has_extension_scheme)
145 return content::NavigationThrottle::CANCEL; 146 return content::NavigationThrottle::CANCEL;
146 147
147 // |url| must be in the manifest's "web_accessible_resources" section. 148 // |url| must be in the manifest's "web_accessible_resources" section.
148 if (!WebAccessibleResourcesInfo::IsResourceWebAccessible(target_extension, 149 if (!WebAccessibleResourcesInfo::IsResourceWebAccessible(target_extension,
149 url.path())) 150 url.path()))
150 return content::NavigationThrottle::BLOCK_REQUEST; 151 return content::NavigationThrottle::BLOCK_REQUEST;
152
153 // A platform app may not be loaded in an <iframe> by another origin.
154 //
155 // In fact, platform apps may not have any cross-origin iframes at all; for
156 // non-extension origins of |url| this is enforced by means of a Content
157 // Security Policy. But CSP is incapable of blocking the chrome-extension
158 // scheme. Thus, this case must be handled specially here.
159 if (target_extension->is_platform_app())
160 return content::NavigationThrottle::CANCEL;
161
162 // A platform app may not load another extension in an <iframe>.
163 const Extension* parent_extension =
164 registry->enabled_extensions().GetExtensionOrAppByURL(
165 parent->GetSiteInstance()->GetSiteURL());
166 if (parent_extension && parent_extension->is_platform_app())
167 return content::NavigationThrottle::BLOCK_REQUEST;
151 } 168 }
152 169
153 return content::NavigationThrottle::PROCEED; 170 return content::NavigationThrottle::PROCEED;
154 } 171 }
155 172
156 content::NavigationThrottle::ThrottleCheckResult 173 content::NavigationThrottle::ThrottleCheckResult
157 ExtensionNavigationThrottle::WillStartRequest() { 174 ExtensionNavigationThrottle::WillStartRequest() {
158 return WillStartOrRedirectRequest(); 175 return WillStartOrRedirectRequest();
159 } 176 }
160 177
161 content::NavigationThrottle::ThrottleCheckResult 178 content::NavigationThrottle::ThrottleCheckResult
162 ExtensionNavigationThrottle::WillRedirectRequest() { 179 ExtensionNavigationThrottle::WillRedirectRequest() {
163 ThrottleCheckResult result = WillStartOrRedirectRequest(); 180 ThrottleCheckResult result = WillStartOrRedirectRequest();
164 if (result == BLOCK_REQUEST) { 181 if (result == BLOCK_REQUEST) {
165 // TODO(nick): https://crbug.com/695421 means that BLOCK_REQUEST does not 182 // TODO(nick): https://crbug.com/695421 means that BLOCK_REQUEST does not
166 // work here. Once PlzNavigate is enabled 100%, just return |result|. 183 // work here. Once PlzNavigate is enabled 100%, just return |result|.
167 return CANCEL; 184 return CANCEL;
168 } 185 }
169 return result; 186 return result;
170 } 187 }
171 188
172 const char* ExtensionNavigationThrottle::GetNameForLogging() { 189 const char* ExtensionNavigationThrottle::GetNameForLogging() {
173 return "ExtensionNavigationThrottle"; 190 return "ExtensionNavigationThrottle";
174 } 191 }
175 192
176 } // namespace extensions 193 } // namespace extensions
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698