Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(216)

Side by Side Diff: extensions/common/file_util.cc

Issue 2686463003: [Extensions] Fix a data race in ChromeExtensionMessageFilter. (Closed)
Patch Set: [Extensions] Fix a data race in ChromeExtensionMessageFilter. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « extensions/common/file_util.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « extensions/common/file_util.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698