| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 9 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| 10 #include "base/strings/string_util.h" | 11 #include "base/strings/string_util.h" |
| 11 #include "base/values.h" | 12 #include "base/values.h" |
| 12 #include "chrome/common/chrome_paths.h" | 13 #include "chrome/common/chrome_paths.h" |
| 13 //#include "chrome/common/url_constants.h" | 14 //#include "chrome/common/url_constants.h" |
| 14 #include "content/public/browser/resource_request_info.h" | 15 #include "content/public/browser/resource_request_info.h" |
| 15 #include "content/public/test/mock_resource_context.h" | 16 #include "content/public/test/mock_resource_context.h" |
| 16 #include "content/public/test/test_browser_thread_bundle.h" | 17 #include "content/public/test/test_browser_thread_bundle.h" |
| 17 #include "extensions/browser/extension_protocols.h" | 18 #include "extensions/browser/extension_protocols.h" |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 scoped_refptr<Extension> extension = | 171 scoped_refptr<Extension> extension = |
| 171 CreateTestExtension(cases[i].name, cases[i].incognito_split_mode); | 172 CreateTestExtension(cases[i].name, cases[i].incognito_split_mode); |
| 172 extension_info_map_->AddExtension( | 173 extension_info_map_->AddExtension( |
| 173 extension.get(), base::Time::Now(), cases[i].incognito_enabled, false); | 174 extension.get(), base::Time::Now(), cases[i].incognito_enabled, false); |
| 174 | 175 |
| 175 // First test a main frame request. | 176 // First test a main frame request. |
| 176 { | 177 { |
| 177 // It doesn't matter that the resource doesn't exist. If the resource | 178 // It doesn't matter that the resource doesn't exist. If the resource |
| 178 // is blocked, we should see ADDRESS_UNREACHABLE. Otherwise, the request | 179 // is blocked, we should see ADDRESS_UNREACHABLE. Otherwise, the request |
| 179 // should just fail because the file doesn't exist. | 180 // should just fail because the file doesn't exist. |
| 180 net::URLRequest request(extension->GetResourceURL("404.html"), | 181 scoped_ptr<net::URLRequest> request( |
| 181 net::DEFAULT_PRIORITY, | 182 resource_context_.GetRequestContext()->CreateRequest( |
| 182 &test_delegate_, | 183 extension->GetResourceURL("404.html"), |
| 183 resource_context_.GetRequestContext()); | 184 net::DEFAULT_PRIORITY, |
| 184 StartRequest(&request, content::RESOURCE_TYPE_MAIN_FRAME); | 185 &test_delegate_, |
| 185 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 186 NULL)); |
| 187 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); |
| 188 EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status()); |
| 186 | 189 |
| 187 if (cases[i].should_allow_main_frame_load) { | 190 if (cases[i].should_allow_main_frame_load) { |
| 188 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request.status().error()) << | 191 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request->status().error()) << |
| 189 cases[i].name; | 192 cases[i].name; |
| 190 } else { | 193 } else { |
| 191 EXPECT_EQ(net::ERR_ADDRESS_UNREACHABLE, request.status().error()) << | 194 EXPECT_EQ(net::ERR_ADDRESS_UNREACHABLE, request->status().error()) << |
| 192 cases[i].name; | 195 cases[i].name; |
| 193 } | 196 } |
| 194 } | 197 } |
| 195 | 198 |
| 196 // Now do a subframe request. | 199 // Now do a subframe request. |
| 197 { | 200 { |
| 198 net::URLRequest request(extension->GetResourceURL("404.html"), | 201 scoped_ptr<net::URLRequest> request( |
| 199 net::DEFAULT_PRIORITY, | 202 resource_context_.GetRequestContext()->CreateRequest( |
| 200 &test_delegate_, | 203 extension->GetResourceURL("404.html"), |
| 201 resource_context_.GetRequestContext()); | 204 net::DEFAULT_PRIORITY, |
| 202 StartRequest(&request, content::RESOURCE_TYPE_SUB_FRAME); | 205 &test_delegate_, |
| 203 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 206 NULL)); |
| 207 StartRequest(request.get(), content::RESOURCE_TYPE_SUB_FRAME); |
| 208 EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status()); |
| 204 | 209 |
| 205 if (cases[i].should_allow_sub_frame_load) { | 210 if (cases[i].should_allow_sub_frame_load) { |
| 206 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request.status().error()) << | 211 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request->status().error()) << |
| 207 cases[i].name; | 212 cases[i].name; |
| 208 } else { | 213 } else { |
| 209 EXPECT_EQ(net::ERR_ADDRESS_UNREACHABLE, request.status().error()) << | 214 EXPECT_EQ(net::ERR_ADDRESS_UNREACHABLE, request->status().error()) << |
| 210 cases[i].name; | 215 cases[i].name; |
| 211 } | 216 } |
| 212 } | 217 } |
| 213 } | 218 } |
| 214 } | 219 } |
| 215 | 220 |
| 216 void CheckForContentLengthHeader(net::URLRequest* request) { | 221 void CheckForContentLengthHeader(net::URLRequest* request) { |
| 217 std::string content_length; | 222 std::string content_length; |
| 218 request->GetResponseHeaderByName(net::HttpRequestHeaders::kContentLength, | 223 request->GetResponseHeaderByName(net::HttpRequestHeaders::kContentLength, |
| 219 &content_length); | 224 &content_length); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 230 SetProtocolHandler(false); | 235 SetProtocolHandler(false); |
| 231 | 236 |
| 232 scoped_refptr<Extension> extension = CreateWebStoreExtension(); | 237 scoped_refptr<Extension> extension = CreateWebStoreExtension(); |
| 233 extension_info_map_->AddExtension(extension.get(), | 238 extension_info_map_->AddExtension(extension.get(), |
| 234 base::Time::Now(), | 239 base::Time::Now(), |
| 235 false, | 240 false, |
| 236 false); | 241 false); |
| 237 | 242 |
| 238 // First test it with the extension enabled. | 243 // First test it with the extension enabled. |
| 239 { | 244 { |
| 240 net::URLRequest request(extension->GetResourceURL("webstore_icon_16.png"), | 245 scoped_ptr<net::URLRequest> request( |
| 241 net::DEFAULT_PRIORITY, | 246 resource_context_.GetRequestContext()->CreateRequest( |
| 242 &test_delegate_, | 247 extension->GetResourceURL("webstore_icon_16.png"), |
| 243 resource_context_.GetRequestContext()); | 248 net::DEFAULT_PRIORITY, |
| 244 StartRequest(&request, content::RESOURCE_TYPE_MEDIA); | 249 &test_delegate_, |
| 245 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 250 NULL)); |
| 246 CheckForContentLengthHeader(&request); | 251 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); |
| 252 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); |
| 253 CheckForContentLengthHeader(request.get()); |
| 247 } | 254 } |
| 248 | 255 |
| 249 // And then test it with the extension disabled. | 256 // And then test it with the extension disabled. |
| 250 extension_info_map_->RemoveExtension(extension->id(), | 257 extension_info_map_->RemoveExtension(extension->id(), |
| 251 UnloadedExtensionInfo::REASON_DISABLE); | 258 UnloadedExtensionInfo::REASON_DISABLE); |
| 252 { | 259 { |
| 253 net::URLRequest request(extension->GetResourceURL("webstore_icon_16.png"), | 260 scoped_ptr<net::URLRequest> request( |
| 254 net::DEFAULT_PRIORITY, | 261 resource_context_.GetRequestContext()->CreateRequest( |
| 255 &test_delegate_, | 262 extension->GetResourceURL("webstore_icon_16.png"), |
| 256 resource_context_.GetRequestContext()); | 263 net::DEFAULT_PRIORITY, |
| 257 StartRequest(&request, content::RESOURCE_TYPE_MEDIA); | 264 &test_delegate_, |
| 258 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 265 NULL)); |
| 259 CheckForContentLengthHeader(&request); | 266 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); |
| 267 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); |
| 268 CheckForContentLengthHeader(request.get()); |
| 260 } | 269 } |
| 261 } | 270 } |
| 262 | 271 |
| 263 // Tests that a URL request for resource from an extension returns a few | 272 // Tests that a URL request for resource from an extension returns a few |
| 264 // expected response headers. | 273 // expected response headers. |
| 265 TEST_F(ExtensionProtocolTest, ResourceRequestResponseHeaders) { | 274 TEST_F(ExtensionProtocolTest, ResourceRequestResponseHeaders) { |
| 266 // Register a non-incognito extension protocol handler. | 275 // Register a non-incognito extension protocol handler. |
| 267 SetProtocolHandler(false); | 276 SetProtocolHandler(false); |
| 268 | 277 |
| 269 scoped_refptr<Extension> extension = CreateTestResponseHeaderExtension(); | 278 scoped_refptr<Extension> extension = CreateTestResponseHeaderExtension(); |
| 270 extension_info_map_->AddExtension(extension.get(), | 279 extension_info_map_->AddExtension(extension.get(), |
| 271 base::Time::Now(), | 280 base::Time::Now(), |
| 272 false, | 281 false, |
| 273 false); | 282 false); |
| 274 | 283 |
| 275 { | 284 { |
| 276 net::URLRequest request(extension->GetResourceURL("test.dat"), | 285 scoped_ptr<net::URLRequest> request( |
| 277 net::DEFAULT_PRIORITY, | 286 resource_context_.GetRequestContext()->CreateRequest( |
| 278 &test_delegate_, | 287 extension->GetResourceURL("test.dat"), |
| 279 resource_context_.GetRequestContext()); | 288 net::DEFAULT_PRIORITY, |
| 280 StartRequest(&request, content::RESOURCE_TYPE_MEDIA); | 289 &test_delegate_, |
| 281 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 290 NULL)); |
| 291 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); |
| 292 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); |
| 282 | 293 |
| 283 // Check that cache-related headers are set. | 294 // Check that cache-related headers are set. |
| 284 std::string etag; | 295 std::string etag; |
| 285 request.GetResponseHeaderByName("ETag", &etag); | 296 request->GetResponseHeaderByName("ETag", &etag); |
| 286 EXPECT_TRUE(StartsWithASCII(etag, "\"", false)); | 297 EXPECT_TRUE(StartsWithASCII(etag, "\"", false)); |
| 287 EXPECT_TRUE(EndsWith(etag, "\"", false)); | 298 EXPECT_TRUE(EndsWith(etag, "\"", false)); |
| 288 | 299 |
| 289 std::string revalidation_header; | 300 std::string revalidation_header; |
| 290 request.GetResponseHeaderByName("cache-control", &revalidation_header); | 301 request->GetResponseHeaderByName("cache-control", &revalidation_header); |
| 291 EXPECT_EQ("no-cache", revalidation_header); | 302 EXPECT_EQ("no-cache", revalidation_header); |
| 292 | 303 |
| 293 // We set test.dat as web-accessible, so it should have a CORS header. | 304 // We set test.dat as web-accessible, so it should have a CORS header. |
| 294 std::string access_control; | 305 std::string access_control; |
| 295 request.GetResponseHeaderByName("Access-Control-Allow-Origin", | 306 request->GetResponseHeaderByName("Access-Control-Allow-Origin", |
| 296 &access_control); | 307 &access_control); |
| 297 EXPECT_EQ("*", access_control); | 308 EXPECT_EQ("*", access_control); |
| 298 } | 309 } |
| 299 } | 310 } |
| 300 | 311 |
| 301 // Tests that a URL request for main frame or subframe from an extension | 312 // Tests that a URL request for main frame or subframe from an extension |
| 302 // succeeds, but subresources fail. See http://crbug.com/312269. | 313 // succeeds, but subresources fail. See http://crbug.com/312269. |
| 303 TEST_F(ExtensionProtocolTest, AllowFrameRequests) { | 314 TEST_F(ExtensionProtocolTest, AllowFrameRequests) { |
| 304 // Register a non-incognito extension protocol handler. | 315 // Register a non-incognito extension protocol handler. |
| 305 SetProtocolHandler(false); | 316 SetProtocolHandler(false); |
| 306 | 317 |
| 307 scoped_refptr<Extension> extension = CreateTestExtension("foo", false); | 318 scoped_refptr<Extension> extension = CreateTestExtension("foo", false); |
| 308 extension_info_map_->AddExtension(extension.get(), | 319 extension_info_map_->AddExtension(extension.get(), |
| 309 base::Time::Now(), | 320 base::Time::Now(), |
| 310 false, | 321 false, |
| 311 false); | 322 false); |
| 312 | 323 |
| 313 // All MAIN_FRAME and SUB_FRAME requests should succeed. | 324 // All MAIN_FRAME and SUB_FRAME requests should succeed. |
| 314 { | 325 { |
| 315 net::URLRequest request(extension->GetResourceURL("test.dat"), | 326 scoped_ptr<net::URLRequest> request( |
| 316 net::DEFAULT_PRIORITY, | 327 resource_context_.GetRequestContext()->CreateRequest( |
| 317 &test_delegate_, | 328 extension->GetResourceURL("test.dat"), |
| 318 resource_context_.GetRequestContext()); | 329 net::DEFAULT_PRIORITY, |
| 319 StartRequest(&request, content::RESOURCE_TYPE_MAIN_FRAME); | 330 &test_delegate_, |
| 320 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 331 NULL)); |
| 332 StartRequest(request.get(), content::RESOURCE_TYPE_MAIN_FRAME); |
| 333 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); |
| 321 } | 334 } |
| 322 { | 335 { |
| 323 net::URLRequest request(extension->GetResourceURL("test.dat"), | 336 scoped_ptr<net::URLRequest> request( |
| 324 net::DEFAULT_PRIORITY, | 337 resource_context_.GetRequestContext()->CreateRequest( |
| 325 &test_delegate_, | 338 extension->GetResourceURL("test.dat"), |
| 326 resource_context_.GetRequestContext()); | 339 net::DEFAULT_PRIORITY, |
| 327 StartRequest(&request, content::RESOURCE_TYPE_SUB_FRAME); | 340 &test_delegate_, |
| 328 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request.status().status()); | 341 NULL)); |
| 342 StartRequest(request.get(), content::RESOURCE_TYPE_SUB_FRAME); |
| 343 EXPECT_EQ(net::URLRequestStatus::SUCCESS, request->status().status()); |
| 329 } | 344 } |
| 330 | 345 |
| 331 // And subresource types, such as media, should fail. | 346 // And subresource types, such as media, should fail. |
| 332 { | 347 { |
| 333 net::URLRequest request(extension->GetResourceURL("test.dat"), | 348 scoped_ptr<net::URLRequest> request( |
| 334 net::DEFAULT_PRIORITY, | 349 resource_context_.GetRequestContext()->CreateRequest( |
| 335 &test_delegate_, | 350 extension->GetResourceURL("test.dat"), |
| 336 resource_context_.GetRequestContext()); | 351 net::DEFAULT_PRIORITY, |
| 337 StartRequest(&request, content::RESOURCE_TYPE_MEDIA); | 352 &test_delegate_, |
| 338 EXPECT_EQ(net::URLRequestStatus::FAILED, request.status().status()); | 353 NULL)); |
| 354 StartRequest(request.get(), content::RESOURCE_TYPE_MEDIA); |
| 355 EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status()); |
| 339 } | 356 } |
| 340 } | 357 } |
| 341 | 358 |
| 342 } // namespace extensions | 359 } // namespace extensions |
| OLD | NEW |