| OLD | NEW |
| 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 "base/memory/ptr_util.h" | 5 #include "base/memory/ptr_util.h" |
| 6 #include "base/strings/stringprintf.h" | 6 #include "base/strings/stringprintf.h" |
| 7 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 7 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| 8 #include "components/crx_file/id_util.h" | 8 #include "components/crx_file/id_util.h" |
| 9 #include "content/public/browser/content_browser_client.h" | 9 #include "content/public/browser/content_browser_client.h" |
| 10 #include "content/public/browser/navigation_handle.h" | 10 #include "content/public/browser/navigation_handle.h" |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 class MockBrowserClient : public content::ContentBrowserClient { | 33 class MockBrowserClient : public content::ContentBrowserClient { |
| 34 public: | 34 public: |
| 35 MockBrowserClient() {} | 35 MockBrowserClient() {} |
| 36 ~MockBrowserClient() override {} | 36 ~MockBrowserClient() override {} |
| 37 | 37 |
| 38 // Only construct an ExtensionNavigationThrottle so that we can test it in | 38 // Only construct an ExtensionNavigationThrottle so that we can test it in |
| 39 // isolation. | 39 // isolation. |
| 40 std::vector<std::unique_ptr<NavigationThrottle>> CreateThrottlesForNavigation( | 40 std::vector<std::unique_ptr<NavigationThrottle>> CreateThrottlesForNavigation( |
| 41 content::NavigationHandle* handle) override { | 41 content::NavigationHandle* handle) override { |
| 42 std::vector<std::unique_ptr<NavigationThrottle>> throttles; | 42 std::vector<std::unique_ptr<NavigationThrottle>> throttles; |
| 43 if (!handle->IsInMainFrame()) { // Mirrors ChromeContentBrowserClient. | 43 throttles.push_back(base::MakeUnique<ExtensionNavigationThrottle>(handle)); |
| 44 throttles.push_back( | |
| 45 base::MakeUnique<ExtensionNavigationThrottle>(handle)); | |
| 46 } | |
| 47 return throttles; | 44 return throttles; |
| 48 } | 45 } |
| 49 }; | 46 }; |
| 50 | 47 |
| 51 } // namespace | 48 } // namespace |
| 52 | 49 |
| 53 class ExtensionNavigationThrottleUnitTest | 50 class ExtensionNavigationThrottleUnitTest |
| 54 : public ChromeRenderViewHostTestHarness { | 51 : public ChromeRenderViewHostTestHarness { |
| 55 public: | 52 public: |
| 56 ExtensionNavigationThrottleUnitTest() {} | 53 ExtensionNavigationThrottleUnitTest() {} |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 CheckTestCase(grand_child, extension()->GetResourceURL(kPrivate), | 160 CheckTestCase(grand_child, extension()->GetResourceURL(kPrivate), |
| 164 NavigationThrottle::BLOCK_REQUEST); | 161 NavigationThrottle::BLOCK_REQUEST); |
| 165 CheckTestCase(grand_child, extension()->GetResourceURL(kAccessible), | 162 CheckTestCase(grand_child, extension()->GetResourceURL(kAccessible), |
| 166 NavigationThrottle::PROCEED); | 163 NavigationThrottle::PROCEED); |
| 167 CheckTestCase(grand_child, | 164 CheckTestCase(grand_child, |
| 168 extension()->GetResourceURL(kAccessibleDirResource), | 165 extension()->GetResourceURL(kAccessibleDirResource), |
| 169 NavigationThrottle::PROCEED); | 166 NavigationThrottle::PROCEED); |
| 170 } | 167 } |
| 171 | 168 |
| 172 // Tests that requests to disabled or non-existent extensions are blocked. | 169 // Tests that requests to disabled or non-existent extensions are blocked. |
| 173 TEST_F(ExtensionNavigationThrottleUnitTest, InvalidExtension) { | 170 TEST_F(ExtensionNavigationThrottleUnitTest, DisabledExtensionChildFrame) { |
| 174 web_contents_tester()->NavigateAndCommit(GURL("http://example.com")); | 171 web_contents_tester()->NavigateAndCommit(GURL("http://example.com")); |
| 175 content::RenderFrameHost* child = | 172 content::RenderFrameHost* child = |
| 176 render_frame_host_tester(main_rfh())->AppendChild("child"); | 173 render_frame_host_tester(main_rfh())->AppendChild("child"); |
| 177 | 174 |
| 178 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context()); | 175 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context()); |
| 179 registry->RemoveEnabled(extension()->id()); | 176 registry->RemoveEnabled(extension()->id()); |
| 180 registry->AddDisabled(extension()); | 177 registry->AddDisabled(extension()); |
| 181 | 178 |
| 182 // Since the extension is disabled, all requests should be blocked. | 179 // Since the extension is disabled, all requests should be blocked. |
| 183 CheckTestCase(child, extension()->GetResourceURL(kPrivate), | 180 CheckTestCase(child, extension()->GetResourceURL(kPrivate), |
| 184 NavigationThrottle::BLOCK_REQUEST); | 181 NavigationThrottle::BLOCK_REQUEST); |
| 185 CheckTestCase(child, extension()->GetResourceURL(kAccessible), | 182 CheckTestCase(child, extension()->GetResourceURL(kAccessible), |
| 186 NavigationThrottle::BLOCK_REQUEST); | 183 NavigationThrottle::BLOCK_REQUEST); |
| 187 CheckTestCase(child, extension()->GetResourceURL(kAccessibleDirResource), | 184 CheckTestCase(child, extension()->GetResourceURL(kAccessibleDirResource), |
| 188 NavigationThrottle::BLOCK_REQUEST); | 185 NavigationThrottle::BLOCK_REQUEST); |
| 189 | 186 |
| 190 std::string second_id = crx_file::id_util::GenerateId("bar"); | 187 std::string second_id = crx_file::id_util::GenerateId("bar"); |
| 191 ASSERT_NE(second_id, extension()->id()); | 188 ASSERT_NE(second_id, extension()->id()); |
| 192 GURL invalid_url(base::StringPrintf("chrome-extension://%s/accessible.html", | 189 GURL unknown_url(base::StringPrintf("chrome-extension://%s/accessible.html", |
| 193 second_id.c_str())); | 190 second_id.c_str())); |
| 194 // Requests to non-existent extensions should be blocked. | 191 // Requests to non-existent extensions should be blocked. |
| 195 CheckTestCase(child, invalid_url, NavigationThrottle::BLOCK_REQUEST); | 192 CheckTestCase(child, unknown_url, NavigationThrottle::BLOCK_REQUEST); |
| 193 |
| 194 // Test blob and filesystem URLs with disabled/unknown extensions. |
| 195 GURL disabled_blob(base::StringPrintf("blob:chrome-extension://%s/SOMEGUID", |
| 196 extension()->id().c_str())); |
| 197 GURL unknown_blob(base::StringPrintf("blob:chrome-extension://%s/SOMEGUID", |
| 198 second_id.c_str())); |
| 199 CheckTestCase(child, disabled_blob, NavigationThrottle::BLOCK_REQUEST); |
| 200 CheckTestCase(child, unknown_blob, NavigationThrottle::BLOCK_REQUEST); |
| 201 GURL disabled_filesystem( |
| 202 base::StringPrintf("filesystem:chrome-extension://%s/temporary/foo.html", |
| 203 extension()->id().c_str())); |
| 204 GURL unknown_filesystem( |
| 205 base::StringPrintf("filesystem:chrome-extension://%s/temporary/foo.html", |
| 206 second_id.c_str())); |
| 207 CheckTestCase(child, disabled_filesystem, NavigationThrottle::BLOCK_REQUEST); |
| 208 CheckTestCase(child, unknown_filesystem, NavigationThrottle::BLOCK_REQUEST); |
| 209 } |
| 210 |
| 211 // Tests that requests to disabled or non-existent extensions are blocked. |
| 212 TEST_F(ExtensionNavigationThrottleUnitTest, DisabledExtensionMainFrame) { |
| 213 web_contents_tester()->NavigateAndCommit(GURL("http://example.com")); |
| 214 |
| 215 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context()); |
| 216 registry->RemoveEnabled(extension()->id()); |
| 217 registry->AddDisabled(extension()); |
| 218 |
| 219 // Since the extension is disabled, all requests should be blocked. |
| 220 CheckTestCase(main_rfh(), extension()->GetResourceURL(kPrivate), |
| 221 NavigationThrottle::BLOCK_REQUEST); |
| 222 CheckTestCase(main_rfh(), extension()->GetResourceURL(kAccessible), |
| 223 NavigationThrottle::BLOCK_REQUEST); |
| 224 CheckTestCase(main_rfh(), extension()->GetResourceURL(kAccessibleDirResource), |
| 225 NavigationThrottle::BLOCK_REQUEST); |
| 226 |
| 227 std::string second_id = crx_file::id_util::GenerateId("bar"); |
| 228 |
| 229 ASSERT_NE(second_id, extension()->id()); |
| 230 GURL unknown_url(base::StringPrintf("chrome-extension://%s/accessible.html", |
| 231 second_id.c_str())); |
| 232 // Requests to non-existent extensions should be blocked. |
| 233 CheckTestCase(main_rfh(), unknown_url, NavigationThrottle::BLOCK_REQUEST); |
| 234 |
| 235 // Test blob and filesystem URLs with disabled/unknown extensions. |
| 236 GURL disabled_blob(base::StringPrintf("blob:chrome-extension://%s/SOMEGUID", |
| 237 extension()->id().c_str())); |
| 238 GURL unknown_blob(base::StringPrintf("blob:chrome-extension://%s/SOMEGUID", |
| 239 second_id.c_str())); |
| 240 CheckTestCase(main_rfh(), disabled_blob, NavigationThrottle::BLOCK_REQUEST); |
| 241 CheckTestCase(main_rfh(), unknown_blob, NavigationThrottle::BLOCK_REQUEST); |
| 242 GURL disabled_filesystem( |
| 243 base::StringPrintf("filesystem:chrome-extension://%s/temporary/foo.html", |
| 244 extension()->id().c_str())); |
| 245 GURL unknown_filesystem( |
| 246 base::StringPrintf("filesystem:chrome-extension://%s/temporary/foo.html", |
| 247 second_id.c_str())); |
| 248 CheckTestCase(main_rfh(), disabled_filesystem, |
| 249 NavigationThrottle::BLOCK_REQUEST); |
| 250 CheckTestCase(main_rfh(), unknown_filesystem, |
| 251 NavigationThrottle::BLOCK_REQUEST); |
| 196 } | 252 } |
| 197 | 253 |
| 198 } // namespace extensions | 254 } // namespace extensions |
| OLD | NEW |