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

Side by Side Diff: chrome/browser/chromeos/extensions/default_app_order.cc

Issue 11318008: cros: Allow default app order to be loaded from an external file. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: for comments in #1 Created 8 years, 1 month 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 | Annotate | Revision Log
OLDNEW
(Empty)
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.
4
5 #include "chrome/browser/chromeos/extensions/default_app_order.h"
6
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "base/file_path.h"
10 #include "base/file_util.h"
11 #include "base/json/json_file_value_serializer.h"
12 #include "base/path_service.h"
13 #include "base/time.h"
14 #include "chrome/common/chrome_paths.h"
15 #include "chrome/common/extensions/extension_constants.h"
16 #include "content/public/browser/browser_thread.h"
17
18 namespace chromeos {
19 namespace default_app_order {
20
21 namespace {
22
23 // The single ExternalLoader instance.
24 ExternalLoader* loader_instance = NULL;
25
26 // Reads external ordinal json file and returned the parsed value. Returns NULL
27 // if the file does not exist or could not be parsed properly. Caller takes
28 // ownership of the returned value.
29 base::ListValue* ReadExternalOrdinalFile(const FilePath& path) {
30 if (!file_util::PathExists(path))
31 return NULL;
32
33 JSONFileValueSerializer serializer(path);
34 std::string error_msg;
35 base::Value* value = serializer.Deserialize(NULL, &error_msg);
36 if (!value) {
37 LOG(WARNING) << "Unable to deserialize default app ordinals json data:"
38 << error_msg << ", file=" << path.value();
39 return NULL;
40 }
41
42 base::ListValue* ordinal_list_value = NULL;
43 if (value->GetAsList(&ordinal_list_value))
44 return ordinal_list_value;
45
46 LOG(WARNING) << "Expect a JSON list in file " << path.value();
47 return NULL;
48 }
49
50 // Gets built-in default app order.
51 void GetDefault(std::vector<std::string>* app_ids) {
52 DCHECK(app_ids && app_ids->empty());
53
54 const char* kDefaultAppOrder[] = {
55 extension_misc::kChromeAppId,
56 extension_misc::kWebStoreAppId,
57 "coobgpohoikkiipiblmjeljniedjpjpf", // Search
58 "blpcfgokakmgnkcojhhkbfbldkacnbeo", // Youtube
59 "pjkljhegncpnkpknbcohdijeoejaedia", // Gmail
60 "ejjicmeblgpmajnghnpcppodonldlgfn", // Calendar
61 "kjebfhglflhjjjiceimfkgicifkhjlnm", // Scratchpad
62 "lneaknkopdijkpnocmklfnjbeapigfbh", // Google Maps
63 "apdfllckaahabafndbhieahigkjlhalf", // Drive
64 "aohghmighlieiainnegkcijnfilokake", // Docs
65 "felcaaldnbdncclmgdcncolpebgiejap", // Sheets
66 "aapocclcgogkmnckokdopfmhonfmgoek", // Slides
67 "dlppkpafhbajpcmmoheippocdidnckmm", // Google+
68 "kbpgddbgniojgndnhlkjbkpknjhppkbk", // Google+ Hangouts
69 "hhaomjibdihmijegdhdafkllkbggdgoj", // Files
70 "hkhhlkdconhgemhegnplaldnmnmkaemd", // Tips & Tricks
71 "icppfcnhkcmnfdhfhphakoifcfokfdhg", // Play Music
72 "mmimngoggfoobjdlefbcabngfnmieonb", // Play Books
73 "fppdphmgcddhjeddoeghpjefkdlccljb", // Play Movies
74 "fobcpibfeplaikcclojfdhfdmbbeofai", // Games
75 "joodangkbfjnajiiifokapkpmhfnpleo", // Calculator
76 "hfhhnacclhffhdffklopdkcgdhifgngh", // Camera
77 "gbchcmhmhahfdphkhkmpfmihenigjmpp", // Chrome Remote Desktop
78 };
79
80 for (size_t i = 0; i < arraysize(kDefaultAppOrder); ++i)
81 app_ids->push_back(std::string(kDefaultAppOrder[i]));
82 }
83
84 } // namespace
85
86 ExternalLoader::ExternalLoader(bool async)
87 : loaded_(true /* manual_rest */, false /* initially_signaled */) {
88 DCHECK(!loader_instance);
89 loader_instance = this;
90
91 if (async) {
92 content::BrowserThread::PostBlockingPoolTask(FROM_HERE,
93 base::Bind(&ExternalLoader::Load, base::Unretained(this)));
94 } else {
95 Load();
96 }
97 }
98
99 ExternalLoader::~ExternalLoader() {
100 DCHECK(loaded_.IsSignaled());
101 DCHECK_EQ(loader_instance, this);
102 loader_instance = NULL;
103 }
104
105 const std::vector<std::string>& ExternalLoader::GetAppIds() {
106 CHECK(loaded_.IsSignaled());
107 return app_ids_;
108 }
109
110 void ExternalLoader::Load() {
111 FilePath ordinals_file;
112 CHECK(PathService::Get(chrome::FILE_DEFAULT_APP_ORDER, &ordinals_file));
113
114 scoped_ptr<base::ListValue> ordinals_value(
115 ReadExternalOrdinalFile(ordinals_file));
116 if (ordinals_value) {
117 for (size_t i = 0; i < ordinals_value->GetSize(); ++i) {
118 std::string app_id;
119 CHECK(ordinals_value->GetString(i, &app_id));
120 app_ids_.push_back(app_id);
121 }
122 } else {
123 GetDefault(&app_ids_);
124 }
125
126 loaded_.Signal();
127 }
128
129 void Get(std::vector<std::string>* app_ids) {
130 // |loader_instance| could be NULL for test.
131 if (!loader_instance) {
132 GetDefault(app_ids);
133 return;
134 }
135
136 *app_ids = loader_instance->GetAppIds();
137 }
138
139 } // namespace default_app_order
140 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698