1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/extensions/api/web_request/web_request_permissions.h"
7 #include "base/message_loop/message_loop.h"
8 #include "chrome/common/extensions/extension_constants.h"
9 #include "chrome/common/extensions/extension_test_util.h"
10 #include "chrome/test/base/testing_profile.h"
11 #include "content/public/browser/resource_request_info.h"
12 #include "content/public/test/test_browser_thread_bundle.h"
13 #include "extensions/browser/info_map.h"
14 #include "ipc/ipc_message.h"
15 #include "net/base/request_priority.h"
16 #include "net/url_request/url_request_test_util.h"
17 #include "testing/gtest/include/gtest/gtest.h"
19 using content::ResourceRequestInfo
;
20 using extensions::Extension
;
21 using extensions::Manifest
;
22 using extension_test_util::LoadManifestUnchecked
;
24 class ExtensionWebRequestHelpersTestWithThreadsTest
: public testing::Test
{
26 ExtensionWebRequestHelpersTestWithThreadsTest()
27 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP
) {}
30 virtual void SetUp() OVERRIDE
;
33 net::TestURLRequestContext context
;
35 // This extension has Web Request permissions, but no host permission.
36 scoped_refptr
<Extension
> permissionless_extension_
;
37 // This extension has Web Request permissions, and *.com a host permission.
38 scoped_refptr
<Extension
> com_extension_
;
39 scoped_refptr
<extensions::InfoMap
> extension_info_map_
;
42 content::TestBrowserThreadBundle thread_bundle_
;
45 void ExtensionWebRequestHelpersTestWithThreadsTest::SetUp() {
46 testing::Test::SetUp();
49 permissionless_extension_
= LoadManifestUnchecked("permissions",
50 "web_request_no_host.json",
51 Manifest::INVALID_LOCATION
,
55 ASSERT_TRUE(permissionless_extension_
.get()) << error
;
57 LoadManifestUnchecked("permissions",
58 "web_request_com_host_permissions.json",
59 Manifest::INVALID_LOCATION
,
63 ASSERT_TRUE(com_extension_
.get()) << error
;
64 extension_info_map_
= new extensions::InfoMap
;
65 extension_info_map_
->AddExtension(permissionless_extension_
.get(),
67 false /*incognito_enabled*/,
68 false /*notifications_disabled*/);
69 extension_info_map_
->AddExtension(
72 false /*incognito_enabled*/,
73 false /*notifications_disabled*/);
76 TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest
, TestHideRequestForURL
) {
77 net::TestURLRequestContext context
;
78 const char* sensitive_urls
[] = {
79 "http://clients2.google.com",
80 "http://clients22.google.com",
81 "https://clients2.google.com",
82 "http://clients2.google.com/service/update2/crx",
83 "https://clients.google.com",
84 "https://test.clients.google.com",
85 "https://clients2.google.com/service/update2/crx",
86 "http://www.gstatic.com/chrome/extensions/blacklist",
87 "https://www.gstatic.com/chrome/extensions/blacklist",
88 "notregisteredscheme://www.foobar.com",
89 "https://chrome.google.com/webstore/",
90 "https://chrome.google.com/webstore/"
91 "inlineinstall/detail/kcnhkahnjcbndmmehfkdnkjomaanaooo"
93 const char* non_sensitive_urls
[] = {
94 "http://www.google.com/"
96 const int kSigninProcessId
= 99;
97 extension_info_map_
->SetSigninProcess(kSigninProcessId
);
99 // Check that requests are rejected based on the destination
100 for (size_t i
= 0; i
< arraysize(sensitive_urls
); ++i
) {
101 GURL
sensitive_url(sensitive_urls
[i
]);
102 net::TestURLRequest
request(
103 sensitive_url
, net::DEFAULT_PRIORITY
, NULL
, &context
);
105 WebRequestPermissions::HideRequest(extension_info_map_
.get(), &request
))
106 << sensitive_urls
[i
];
108 // Check that requests are accepted if they don't touch sensitive urls.
109 for (size_t i
= 0; i
< arraysize(non_sensitive_urls
); ++i
) {
110 GURL
non_sensitive_url(non_sensitive_urls
[i
]);
111 net::TestURLRequest
request(
112 non_sensitive_url
, net::DEFAULT_PRIORITY
, NULL
, &context
);
114 WebRequestPermissions::HideRequest(extension_info_map_
.get(), &request
))
115 << non_sensitive_urls
[i
];
118 // Check protection of requests originating from the frame showing the Chrome
120 // Normally this request is not protected:
121 GURL
non_sensitive_url("http://www.google.com/test.js");
122 net::TestURLRequest
non_sensitive_request(
123 non_sensitive_url
, net::DEFAULT_PRIORITY
, NULL
, &context
);
124 EXPECT_FALSE(WebRequestPermissions::HideRequest(extension_info_map_
.get(),
125 &non_sensitive_request
));
126 // If the origin is labeled by the WebStoreAppId, it becomes protected.
129 int site_instance_id
= 23;
131 net::TestURLRequest
sensitive_request(
132 non_sensitive_url
, net::DEFAULT_PRIORITY
, NULL
, &context
);
133 ResourceRequestInfo::AllocateForTesting(
134 &sensitive_request
, ResourceType::SCRIPT
, NULL
,
135 process_id
, view_id
, MSG_ROUTING_NONE
, false);
136 extension_info_map_
->RegisterExtensionProcess(
137 extension_misc::kWebStoreAppId
, process_id
, site_instance_id
);
138 EXPECT_TRUE(WebRequestPermissions::HideRequest(extension_info_map_
.get(),
139 &sensitive_request
));
141 // If the process is the signin process, it becomes protected.
143 int process_id
= kSigninProcessId
;
145 net::TestURLRequest
sensitive_request(
146 non_sensitive_url
, net::DEFAULT_PRIORITY
, NULL
, &context
);
147 ResourceRequestInfo::AllocateForTesting(
148 &sensitive_request
, ResourceType::SCRIPT
, NULL
,
149 process_id
, view_id
, MSG_ROUTING_NONE
, false);
150 EXPECT_TRUE(WebRequestPermissions::HideRequest(extension_info_map_
.get(),
151 &sensitive_request
));
155 TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest
,
156 TestCanExtensionAccessURL_HostPermissions
) {
157 net::TestURLRequest
request(
158 GURL("http://example.com"), net::DEFAULT_PRIORITY
, NULL
, &context
);
160 EXPECT_TRUE(WebRequestPermissions::CanExtensionAccessURL(
161 extension_info_map_
.get(),
162 permissionless_extension_
->id(),
164 false /*crosses_incognito*/,
165 WebRequestPermissions::DO_NOT_CHECK_HOST
));
166 EXPECT_FALSE(WebRequestPermissions::CanExtensionAccessURL(
167 extension_info_map_
.get(),
168 permissionless_extension_
->id(),
170 false /*crosses_incognito*/,
171 WebRequestPermissions::REQUIRE_HOST_PERMISSION
));
172 EXPECT_TRUE(WebRequestPermissions::CanExtensionAccessURL(
173 extension_info_map_
.get(),
174 com_extension_
->id(),
176 false /*crosses_incognito*/,
177 WebRequestPermissions::REQUIRE_HOST_PERMISSION
));
178 EXPECT_FALSE(WebRequestPermissions::CanExtensionAccessURL(
179 extension_info_map_
.get(),
180 com_extension_
->id(),
182 false /*crosses_incognito*/,
183 WebRequestPermissions::REQUIRE_ALL_URLS
));