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

Side by Side Diff: chrome/browser/extensions/external_extension_provider_impl.h

Issue 8245018: Remove race condition when installing default apps into a new profile. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Fix more trybot breaks Created 9 years, 2 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #ifndef CHROME_BROWSER_EXTENSIONS_EXTERNAL_EXTENSION_PROVIDER_IMPL_H_ 5 #ifndef CHROME_BROWSER_EXTENSIONS_EXTERNAL_EXTENSION_PROVIDER_IMPL_H_
6 #define CHROME_BROWSER_EXTENSIONS_EXTERNAL_EXTENSION_PROVIDER_IMPL_H_ 6 #define CHROME_BROWSER_EXTENSIONS_EXTERNAL_EXTENSION_PROVIDER_IMPL_H_
7 #pragma once 7 #pragma once
8 8
9 #include "chrome/browser/extensions/external_extension_provider_interface.h" 9 #include "chrome/browser/extensions/external_extension_provider_interface.h"
10 10
11 #include "base/memory/ref_counted.h" 11 #include "base/memory/ref_counted.h"
12 #include "chrome/browser/extensions/external_extension_loader.h" 12 #include "chrome/browser/extensions/external_extension_loader.h"
13 #include "content/common/notification_observer.h"
14 #include "content/common/notification_registrar.h"
13 15
14 class ExternalExtensionLoader; 16 class ExternalExtensionLoader;
15 class Profile; 17 class Profile;
16 class Version; 18 class Version;
17 19
18 namespace base { 20 namespace base {
19 class DictionaryValue; 21 class DictionaryValue;
20 class ValueSerializer; 22 class ValueSerializer;
21 } 23 }
22 24
(...skipping 20 matching lines...) Expand all
43 virtual ~ExternalExtensionProviderImpl(); 45 virtual ~ExternalExtensionProviderImpl();
44 46
45 // Populates a list with providers for all known sources. 47 // Populates a list with providers for all known sources.
46 static void CreateExternalProviders( 48 static void CreateExternalProviders(
47 VisitorInterface* service, 49 VisitorInterface* service,
48 Profile* profile, 50 Profile* profile,
49 ProviderCollection* provider_list); 51 ProviderCollection* provider_list);
50 52
51 // Sets underlying prefs and notifies provider. Only to be called by the 53 // Sets underlying prefs and notifies provider. Only to be called by the
52 // owned ExternalExtensionLoader instance. 54 // owned ExternalExtensionLoader instance.
53 void SetPrefs(base::DictionaryValue* prefs); 55 virtual void SetPrefs(base::DictionaryValue* prefs);
Mihai Parparita -not on Chrome 2011/10/19 07:31:36 I'm getting uncomfortable with the increased overr
Roger Tawa OOO till Jul 10th 2011/10/19 20:48:25 I could create a separate implementation of Extern
54 56
55 // ExternalExtensionProvider implementation: 57 // ExternalExtensionProvider implementation:
56 virtual void ServiceShutdown() OVERRIDE; 58 virtual void ServiceShutdown() OVERRIDE;
57 virtual void VisitRegisteredExtension() const OVERRIDE; 59 virtual void VisitRegisteredExtension() const OVERRIDE;
58 virtual bool HasExtension(const std::string& id) const OVERRIDE; 60 virtual bool HasExtension(const std::string& id) const OVERRIDE;
59 virtual bool GetExtensionDetails(const std::string& id, 61 virtual bool GetExtensionDetails(const std::string& id,
60 Extension::Location* location, 62 Extension::Location* location,
61 scoped_ptr<Version>* version) const OVERRIDE; 63 scoped_ptr<Version>* version) const OVERRIDE;
62 64
63 virtual bool IsReady(); 65 virtual bool IsReady();
64 66
65 static const char kLocation[]; 67 static const char kLocation[];
66 static const char kState[]; 68 static const char kState[];
67 static const char kExternalCrx[]; 69 static const char kExternalCrx[];
68 static const char kExternalVersion[]; 70 static const char kExternalVersion[];
69 static const char kExternalUpdateUrl[]; 71 static const char kExternalUpdateUrl[];
70 static const char kSupportedLocales[]; 72 static const char kSupportedLocales[];
71 73
74 // Used only for testing.
75 const std::set<std::string>& invalid_extensions() const {
76 return invalid_extensions_;
77 }
78
72 protected: 79 protected:
73 VisitorInterface* service() const { return service_; } 80 VisitorInterface* service() const { return service_; }
74 81
82 base::DictionaryValue* prefs() const { return prefs_.get(); }
83
75 private: 84 private:
76 // Location for external extensions that are provided by this provider from 85 // Location for external extensions that are provided by this provider from
77 // local crx files. 86 // local crx files.
78 const Extension::Location crx_location_; 87 const Extension::Location crx_location_;
79 88
80 // Location for external extensions that are provided by this provider from 89 // Location for external extensions that are provided by this provider from
81 // update URLs. 90 // update URLs.
82 const Extension::Location download_location_; 91 const Extension::Location download_location_;
83 92
84 // Weak pointer to the object that consumes the external extensions. 93 // Weak pointer to the object that consumes the external extensions.
85 // This is zeroed out by: ServiceShutdown() 94 // This is zeroed out by: ServiceShutdown()
86 VisitorInterface* service_; // weak 95 VisitorInterface* service_; // weak
87 96
88 // Dictionary of the external extensions that are provided by this provider. 97 // Dictionary of the external extensions that are provided by this provider.
89 scoped_ptr<base::DictionaryValue> prefs_; 98 scoped_ptr<base::DictionaryValue> prefs_;
90 99
91 // Indicates that the extensions provided by this provider are loaded 100 // Indicates that the extensions provided by this provider are loaded
92 // entirely. 101 // entirely.
93 bool ready_; 102 bool ready_;
94 103
95 // The loader that loads the list of external extensions and reports them 104 // The loader that loads the list of external extensions and reports them
96 // via |SetPrefs|. 105 // via |SetPrefs|.
97 scoped_refptr<ExternalExtensionLoader> loader_; 106 scoped_refptr<ExternalExtensionLoader> loader_;
98 107
108 // Extensions that were found to be invalid while processing the prefs_
109 // dictionary. These are extensions that this provider did not even attempt
110 // to install because they failed one or more of the checks in SetPrefs().
111 //
112 // TODO(mihai): It would be nice to simply remove these extensions from
113 // prefs_, but for now, there is code that depends on these invalid extensions
Mihai Parparita -not on Chrome 2011/10/19 07:31:36 What code are you referring to here?
Roger Tawa OOO till Jul 10th 2011/10/19 20:48:25 If you look at patch set #1 of this CL, I was addi
114 // still being available to HasExtension(). See how to fix this.
115 std::set<std::string> invalid_extensions_;
116
99 DISALLOW_COPY_AND_ASSIGN(ExternalExtensionProviderImpl); 117 DISALLOW_COPY_AND_ASSIGN(ExternalExtensionProviderImpl);
100 }; 118 };
101 119
120 #if !defined(OS_CHROMEOS)
121 class DefaultAppsProvider : public ExternalExtensionProviderImpl,
Mihai Parparita -not on Chrome 2011/10/19 07:31:36 Now that you're exposing this class in the header
Finnur 2011/10/19 10:01:29 +1 On 2011/10/19 07:31:36, Mihai Parparita wrote:
Roger Tawa OOO till Jul 10th 2011/10/19 20:48:25 Done.
Roger Tawa OOO till Jul 10th 2011/10/19 20:48:25 Done.
122 public NotificationObserver {
123 public:
124 DefaultAppsProvider(VisitorInterface* service,
125 ExternalExtensionLoader* loader,
126 Profile* profile);
127 virtual ~DefaultAppsProvider();
128
129 // ExternalExtensionProviderImpl overrides:
130 virtual void SetPrefs(base::DictionaryValue* prefs) OVERRIDE;
131 virtual void ServiceShutdown() OVERRIDE;
132 virtual void VisitRegisteredExtension() const OVERRIDE;
133
134 // Implementation of NotificationObserver:
135 virtual void Observe(int type,
136 const NotificationSource& source,
137 const NotificationDetails& details) OVERRIDE;
138
139 // Used only for testing.
140 const std::set<std::string>& install_error_extensions() const {
141 return install_error_extensions_;
142 }
143
144 enum InstallState {
Finnur 2011/10/19 10:01:29 Perhaps document that the values of these enums ar
Roger Tawa OOO till Jul 10th 2011/10/19 20:48:25 Done.
145 kInstallNotStarted,
146 kInstalling,
147 kInstallDone
148 };
Finnur 2011/10/19 10:01:29 nit: enum should be at the top of the public secti
Roger Tawa OOO till Jul 10th 2011/10/19 20:48:25 Done.
149
150 private:
151 Profile* profile_;
152 NotificationRegistrar registrar_;
153
154 // Set of extensions that failed to install for some reason.
155 std::set<std::string> install_error_extensions_;
156
157 DISALLOW_COPY_AND_ASSIGN(DefaultAppsProvider);
158 };
159 #endif
160
102 #endif // CHROME_BROWSER_EXTENSIONS_EXTERNAL_EXTENSION_PROVIDER_IMPL_H_ 161 #endif // CHROME_BROWSER_EXTENSIONS_EXTERNAL_EXTENSION_PROVIDER_IMPL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698