OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 "chrome/browser/extensions/extension_protocols.h" | 5 #include "chrome/browser/extensions/extension_protocols.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 base::FilePath* file_path) { | 198 base::FilePath* file_path) { |
199 *file_path = resource.GetFilePath(); | 199 *file_path = resource.GetFilePath(); |
200 } | 200 } |
201 | 201 |
202 class URLRequestExtensionJob : public net::URLRequestFileJob { | 202 class URLRequestExtensionJob : public net::URLRequestFileJob { |
203 public: | 203 public: |
204 URLRequestExtensionJob(net::URLRequest* request, | 204 URLRequestExtensionJob(net::URLRequest* request, |
205 net::NetworkDelegate* network_delegate, | 205 net::NetworkDelegate* network_delegate, |
206 const std::string& extension_id, | 206 const std::string& extension_id, |
207 const base::FilePath& directory_path, | 207 const base::FilePath& directory_path, |
| 208 const base::FilePath& relative_path, |
208 const std::string& content_security_policy, | 209 const std::string& content_security_policy, |
209 bool send_cors_header) | 210 bool send_cors_header) |
210 : net::URLRequestFileJob(request, network_delegate, base::FilePath()), | 211 : net::URLRequestFileJob(request, network_delegate, base::FilePath()), |
211 // TODO(tc): Move all of these files into resources.pak so we don't break | 212 // TODO(tc): Move all of these files into resources.pak so we don't break |
212 // when updating on Linux. | 213 // when updating on Linux. |
213 resource_(extension_id, directory_path, | 214 resource_(extension_id, directory_path, relative_path), |
214 extension_file_util::ExtensionURLToRelativeFilePath( | |
215 request->url())), | |
216 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 215 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
217 response_info_.headers = BuildHttpHeaders(content_security_policy, | 216 response_info_.headers = BuildHttpHeaders(content_security_policy, |
218 send_cors_header); | 217 send_cors_header); |
219 } | 218 } |
220 | 219 |
221 virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE { | 220 virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE { |
222 *info = response_info_; | 221 *info = response_info_; |
223 } | 222 } |
224 | 223 |
225 virtual void Start() OVERRIDE { | 224 virtual void Start() OVERRIDE { |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 const bool is_incognito_; | 380 const bool is_incognito_; |
382 ExtensionInfoMap* const extension_info_map_; | 381 ExtensionInfoMap* const extension_info_map_; |
383 DISALLOW_COPY_AND_ASSIGN(ExtensionProtocolHandler); | 382 DISALLOW_COPY_AND_ASSIGN(ExtensionProtocolHandler); |
384 }; | 383 }; |
385 | 384 |
386 // Creates URLRequestJobs for extension:// URLs. | 385 // Creates URLRequestJobs for extension:// URLs. |
387 net::URLRequestJob* | 386 net::URLRequestJob* |
388 ExtensionProtocolHandler::MaybeCreateJob( | 387 ExtensionProtocolHandler::MaybeCreateJob( |
389 net::URLRequest* request, net::NetworkDelegate* network_delegate) const { | 388 net::URLRequest* request, net::NetworkDelegate* network_delegate) const { |
390 // chrome-extension://extension-id/resource/path.js | 389 // chrome-extension://extension-id/resource/path.js |
391 const std::string& extension_id = request->url().host(); | 390 std::string extension_id = request->url().host(); |
392 const Extension* extension = | 391 const Extension* extension = |
393 extension_info_map_->extensions().GetByID(extension_id); | 392 extension_info_map_->extensions().GetByID(extension_id); |
394 | 393 |
395 // TODO(mpcomplete): better error code. | 394 // TODO(mpcomplete): better error code. |
396 if (!AllowExtensionResourceLoad( | 395 if (!AllowExtensionResourceLoad( |
397 request, is_incognito_, extension, extension_info_map_)) { | 396 request, is_incognito_, extension, extension_info_map_)) { |
398 return new net::URLRequestErrorJob( | 397 return new net::URLRequestErrorJob( |
399 request, network_delegate, net::ERR_ADDRESS_UNREACHABLE); | 398 request, network_delegate, net::ERR_ADDRESS_UNREACHABLE); |
400 } | 399 } |
401 | 400 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 return new URLRequestResourceBundleJob( | 454 return new URLRequestResourceBundleJob( |
456 request, | 455 request, |
457 network_delegate, | 456 network_delegate, |
458 relative_path, | 457 relative_path, |
459 resource_id, | 458 resource_id, |
460 content_security_policy, | 459 content_security_policy, |
461 send_cors_header); | 460 send_cors_header); |
462 } | 461 } |
463 } | 462 } |
464 | 463 |
| 464 relative_path = |
| 465 extension_file_util::ExtensionURLToRelativeFilePath(request->url()); |
| 466 |
| 467 if (Extension::IsImportedPath(path)) { |
| 468 std::string new_extension_id; |
| 469 std::string new_relative_path; |
| 470 Extension::ParseImportedPath(path, &new_extension_id, &new_relative_path); |
| 471 const Extension* new_extension = |
| 472 extension_info_map_->extensions().GetByID(new_extension_id); |
| 473 |
| 474 bool first_party_in_import = false; |
| 475 // NB: This first_party_for_cookies call is not for security, it is only |
| 476 // used so an exported extension can limit the visible surface to the |
| 477 // extension that imports it, more or less constituting its API. |
| 478 const std::string& first_party_path = |
| 479 request->first_party_for_cookies().path(); |
| 480 if (Extension::IsImportedPath(first_party_path)) { |
| 481 std::string first_party_id; |
| 482 std::string dummy; |
| 483 Extension::ParseImportedPath(first_party_path, &first_party_id, &dummy); |
| 484 if (first_party_id == new_extension_id) { |
| 485 first_party_in_import = true; |
| 486 } |
| 487 } |
| 488 |
| 489 if (extension->Imports(new_extension_id) && |
| 490 new_extension && |
| 491 (first_party_in_import || |
| 492 new_extension->IsExportAllowed(new_relative_path))) { |
| 493 directory_path = new_extension->path(); |
| 494 extension_id = new_extension_id; |
| 495 relative_path = base::FilePath(new_relative_path); |
| 496 } else { |
| 497 return NULL; |
| 498 } |
| 499 } |
| 500 |
465 return new URLRequestExtensionJob(request, | 501 return new URLRequestExtensionJob(request, |
466 network_delegate, | 502 network_delegate, |
467 extension_id, | 503 extension_id, |
468 directory_path, | 504 directory_path, |
| 505 relative_path, |
469 content_security_policy, | 506 content_security_policy, |
470 send_cors_header); | 507 send_cors_header); |
471 } | 508 } |
472 | 509 |
473 } // namespace | 510 } // namespace |
474 | 511 |
475 net::URLRequestJobFactory::ProtocolHandler* CreateExtensionProtocolHandler( | 512 net::URLRequestJobFactory::ProtocolHandler* CreateExtensionProtocolHandler( |
476 bool is_incognito, | 513 bool is_incognito, |
477 ExtensionInfoMap* extension_info_map) { | 514 ExtensionInfoMap* extension_info_map) { |
478 return new ExtensionProtocolHandler(is_incognito, extension_info_map); | 515 return new ExtensionProtocolHandler(is_incognito, extension_info_map); |
479 } | 516 } |
OLD | NEW |