| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/common/file_util.h" | 5 #include "extensions/common/file_util.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <map> | 10 #include <map> |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 #include "extensions/common/extension.h" | 31 #include "extensions/common/extension.h" |
| 32 #include "extensions/common/extension_icon_set.h" | 32 #include "extensions/common/extension_icon_set.h" |
| 33 #include "extensions/common/extension_l10n_util.h" | 33 #include "extensions/common/extension_l10n_util.h" |
| 34 #include "extensions/common/extension_set.h" | 34 #include "extensions/common/extension_set.h" |
| 35 #include "extensions/common/install_warning.h" | 35 #include "extensions/common/install_warning.h" |
| 36 #include "extensions/common/manifest.h" | 36 #include "extensions/common/manifest.h" |
| 37 #include "extensions/common/manifest_constants.h" | 37 #include "extensions/common/manifest_constants.h" |
| 38 #include "extensions/common/manifest_handler.h" | 38 #include "extensions/common/manifest_handler.h" |
| 39 #include "extensions/common/manifest_handlers/default_locale_handler.h" | 39 #include "extensions/common/manifest_handlers/default_locale_handler.h" |
| 40 #include "extensions/common/manifest_handlers/icons_handler.h" | 40 #include "extensions/common/manifest_handlers/icons_handler.h" |
| 41 #include "extensions/common/manifest_handlers/shared_module_info.h" | |
| 42 #include "grit/extensions_strings.h" | 41 #include "grit/extensions_strings.h" |
| 43 #include "net/base/escape.h" | 42 #include "net/base/escape.h" |
| 44 #include "net/base/filename_util.h" | 43 #include "net/base/filename_util.h" |
| 45 #include "ui/base/l10n/l10n_util.h" | 44 #include "ui/base/l10n/l10n_util.h" |
| 46 #include "url/gurl.h" | 45 #include "url/gurl.h" |
| 47 | 46 |
| 48 namespace extensions { | 47 namespace extensions { |
| 49 namespace file_util { | 48 namespace file_util { |
| 50 namespace { | 49 namespace { |
| 51 | 50 |
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 extension_l10n_util::CurrentLocaleOrDefault(), | 506 extension_l10n_util::CurrentLocaleOrDefault(), |
| 508 error); | 507 error); |
| 509 | 508 |
| 510 return message_bundle; | 509 return message_bundle; |
| 511 } | 510 } |
| 512 | 511 |
| 513 MessageBundle::SubstitutionMap* LoadMessageBundleSubstitutionMap( | 512 MessageBundle::SubstitutionMap* LoadMessageBundleSubstitutionMap( |
| 514 const base::FilePath& extension_path, | 513 const base::FilePath& extension_path, |
| 515 const std::string& extension_id, | 514 const std::string& extension_id, |
| 516 const std::string& default_locale) { | 515 const std::string& default_locale) { |
| 516 return LoadMessageBundleSubstitutionMapFromPaths( |
| 517 {extension_path}, extension_id, default_locale); |
| 518 } |
| 519 |
| 520 MessageBundle::SubstitutionMap* LoadNonLocalizedMessageBundleSubstitutionMap( |
| 521 const std::string& extension_id) { |
| 517 MessageBundle::SubstitutionMap* return_value = | 522 MessageBundle::SubstitutionMap* return_value = |
| 518 new MessageBundle::SubstitutionMap(); | 523 new MessageBundle::SubstitutionMap(); |
| 519 if (!default_locale.empty()) { | |
| 520 // Touch disk only if extension is localized. | |
| 521 std::string error; | |
| 522 std::unique_ptr<MessageBundle> bundle( | |
| 523 LoadMessageBundle(extension_path, default_locale, &error)); | |
| 524 | 524 |
| 525 if (bundle.get()) | 525 // Add @@extension_id reserved message here. |
| 526 *return_value = *bundle->dictionary(); | |
| 527 } | |
| 528 | |
| 529 // Add @@extension_id reserved message here, so it's available to | |
| 530 // non-localized extensions too. | |
| 531 return_value->insert( | 526 return_value->insert( |
| 532 std::make_pair(MessageBundle::kExtensionIdKey, extension_id)); | 527 std::make_pair(MessageBundle::kExtensionIdKey, extension_id)); |
| 533 | 528 |
| 534 return return_value; | 529 return return_value; |
| 535 } | 530 } |
| 536 | 531 |
| 537 MessageBundle::SubstitutionMap* LoadMessageBundleSubstitutionMapWithImports( | 532 MessageBundle::SubstitutionMap* LoadMessageBundleSubstitutionMapFromPaths( |
| 533 const std::vector<base::FilePath>& paths, |
| 538 const std::string& extension_id, | 534 const std::string& extension_id, |
| 539 const ExtensionSet& extension_set) { | 535 const std::string& default_locale) { |
| 540 const Extension* extension = extension_set.GetByID(extension_id); | |
| 541 MessageBundle::SubstitutionMap* return_value = | 536 MessageBundle::SubstitutionMap* return_value = |
| 542 new MessageBundle::SubstitutionMap(); | 537 LoadNonLocalizedMessageBundleSubstitutionMap(extension_id); |
| 543 | |
| 544 // Add @@extension_id reserved message here, so it's available to | |
| 545 // non-localized extensions too. | |
| 546 return_value->insert( | |
| 547 std::make_pair(MessageBundle::kExtensionIdKey, extension_id)); | |
| 548 | |
| 549 base::FilePath extension_path; | |
| 550 std::string default_locale; | |
| 551 if (!extension) { | |
| 552 NOTREACHED() << "Missing extension " << extension_id; | |
| 553 return return_value; | |
| 554 } | |
| 555 | 538 |
| 556 // Touch disk only if extension is localized. | 539 // Touch disk only if extension is localized. |
| 557 default_locale = LocaleInfo::GetDefaultLocale(extension); | 540 if (default_locale.empty()) |
| 558 if (default_locale.empty()) { | |
| 559 return return_value; | 541 return return_value; |
| 560 } | |
| 561 | 542 |
| 562 std::string error; | 543 std::string error; |
| 563 std::unique_ptr<MessageBundle> bundle( | 544 for (const base::FilePath& path : paths) { |
| 564 LoadMessageBundle(extension->path(), default_locale, &error)); | 545 std::unique_ptr<MessageBundle> bundle( |
| 546 LoadMessageBundle(path, default_locale, &error)); |
| 565 | 547 |
| 566 if (bundle.get()) { | 548 if (bundle) { |
| 567 for (auto iter : *bundle->dictionary()) { | 549 for (const auto& iter : *bundle->dictionary()) { |
| 568 return_value->insert(std::make_pair(iter.first, iter.second)); | |
| 569 } | |
| 570 } | |
| 571 | |
| 572 auto imports = extensions::SharedModuleInfo::GetImports(extension); | |
| 573 // Iterate through the imports in reverse. This will allow later imported | |
| 574 // modules to override earlier imported modules, as the list order is | |
| 575 // maintained from the definition in manifest.json of the imports. | |
| 576 for (auto it = imports.rbegin(); it != imports.rend(); ++it) { | |
| 577 const extensions::Extension* imported_extension = | |
| 578 extension_set.GetByID(it->extension_id); | |
| 579 if (!imported_extension) { | |
| 580 NOTREACHED() << "Missing shared module " << it->extension_id; | |
| 581 continue; | |
| 582 } | |
| 583 std::unique_ptr<MessageBundle> imported_bundle( | |
| 584 LoadMessageBundle(imported_extension->path(), default_locale, &error)); | |
| 585 | |
| 586 if (imported_bundle.get()) { | |
| 587 for (auto iter : *imported_bundle->dictionary()) { | |
| 588 // |insert| only adds new entries, and does not replace entries in | 550 // |insert| only adds new entries, and does not replace entries in |
| 589 // the main extension or previously processed imports. | 551 // the main extension or previously processed imports. |
| 590 return_value->insert(std::make_pair(iter.first, iter.second)); | 552 return_value->insert(std::make_pair(iter.first, iter.second)); |
| 591 } | 553 } |
| 592 } | 554 } |
| 593 } | 555 } |
| 594 | 556 |
| 595 return return_value; | 557 return return_value; |
| 596 } | 558 } |
| 597 | 559 |
| 598 base::FilePath GetVerifiedContentsPath(const base::FilePath& extension_path) { | 560 base::FilePath GetVerifiedContentsPath(const base::FilePath& extension_path) { |
| 599 return extension_path.Append(kMetadataFolder) | 561 return extension_path.Append(kMetadataFolder) |
| 600 .Append(kVerifiedContentsFilename); | 562 .Append(kVerifiedContentsFilename); |
| 601 } | 563 } |
| 602 base::FilePath GetComputedHashesPath(const base::FilePath& extension_path) { | 564 base::FilePath GetComputedHashesPath(const base::FilePath& extension_path) { |
| 603 return extension_path.Append(kMetadataFolder).Append(kComputedHashesFilename); | 565 return extension_path.Append(kMetadataFolder).Append(kComputedHashesFilename); |
| 604 } | 566 } |
| 605 | 567 |
| 606 } // namespace file_util | 568 } // namespace file_util |
| 607 } // namespace extensions | 569 } // namespace extensions |
| OLD | NEW |