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

Side by Side Diff: chrome/browser/sync/glue/extension_change_processor.cc

Issue 2884027: Added checks to handle unsyncable extensions. (Closed)
Patch Set: Fixed comment typo Created 10 years, 5 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
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/sync/glue/extension_change_processor.h" 5 #include "chrome/browser/sync/glue/extension_change_processor.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 #include <string> 8 #include <string>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "chrome/browser/chrome_thread.h" 11 #include "chrome/browser/chrome_thread.h"
12 #include "chrome/browser/extensions/extensions_service.h"
13 #include "chrome/browser/profile.h"
12 #include "chrome/browser/sync/engine/syncapi.h" 14 #include "chrome/browser/sync/engine/syncapi.h"
13 #include "chrome/browser/sync/glue/extension_model_associator.h" 15 #include "chrome/browser/sync/glue/extension_model_associator.h"
14 #include "chrome/browser/sync/glue/extension_util.h" 16 #include "chrome/browser/sync/glue/extension_util.h"
15 #include "chrome/common/extensions/extension.h" 17 #include "chrome/common/extensions/extension.h"
16 #include "chrome/common/notification_details.h" 18 #include "chrome/common/notification_details.h"
17 #include "chrome/common/notification_source.h" 19 #include "chrome/common/notification_source.h"
18 20
19 namespace browser_sync { 21 namespace browser_sync {
20 22
21 ExtensionChangeProcessor::ExtensionChangeProcessor( 23 ExtensionChangeProcessor::ExtensionChangeProcessor(
(...skipping 22 matching lines...) Expand all
44 DCHECK(running()); 46 DCHECK(running());
45 DCHECK(profile_); 47 DCHECK(profile_);
46 switch (type.value) { 48 switch (type.value) {
47 case NotificationType::EXTENSION_LOADED: 49 case NotificationType::EXTENSION_LOADED:
48 case NotificationType::EXTENSION_UPDATE_DISABLED: 50 case NotificationType::EXTENSION_UPDATE_DISABLED:
49 case NotificationType::EXTENSION_UNLOADED: 51 case NotificationType::EXTENSION_UNLOADED:
50 case NotificationType::EXTENSION_UNLOADED_DISABLED: { 52 case NotificationType::EXTENSION_UNLOADED_DISABLED: {
51 DCHECK_EQ(Source<Profile>(source).ptr(), profile_); 53 DCHECK_EQ(Source<Profile>(source).ptr(), profile_);
52 Extension* extension = Details<Extension>(details).ptr(); 54 Extension* extension = Details<Extension>(details).ptr();
53 CHECK(extension); 55 CHECK(extension);
56 // Ignore non-syncable extensions.
54 if (!IsExtensionSyncable(*extension)) { 57 if (!IsExtensionSyncable(*extension)) {
55 return; 58 return;
56 } 59 }
57 const std::string& id = extension->id(); 60 const std::string& id = extension->id();
58 LOG(INFO) << "Got change notification of type " << type.value 61 LOG(INFO) << "Got change notification of type " << type.value
59 << " for extension " << id; 62 << " for extension " << id;
60 if (!extension_model_associator_->OnClientUpdate(id)) { 63 if (!extension_model_associator_->OnClientUpdate(id)) {
61 std::string error = std::string("Client update failed for ") + id; 64 std::string error = std::string("Client update failed for ") + id;
62 error_handler()->OnUnrecoverableError(FROM_HERE, error); 65 error_handler()->OnUnrecoverableError(FROM_HERE, error);
63 return; 66 return;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 DCHECK_EQ(node.GetModelType(), syncable::EXTENSIONS); 98 DCHECK_EQ(node.GetModelType(), syncable::EXTENSIONS);
96 const sync_pb::ExtensionSpecifics& specifics = 99 const sync_pb::ExtensionSpecifics& specifics =
97 node.GetExtensionSpecifics(); 100 node.GetExtensionSpecifics();
98 if (!IsExtensionSpecificsValid(specifics)) { 101 if (!IsExtensionSpecificsValid(specifics)) {
99 std::string error = 102 std::string error =
100 std::string("Invalid server specifics: ") + 103 std::string("Invalid server specifics: ") +
101 ExtensionSpecificsToString(specifics); 104 ExtensionSpecificsToString(specifics);
102 error_handler()->OnUnrecoverableError(FROM_HERE, error); 105 error_handler()->OnUnrecoverableError(FROM_HERE, error);
103 return; 106 return;
104 } 107 }
108 const std::string& id = specifics.id();
109 CHECK(profile_);
110 ExtensionsService* extensions_service =
111 profile_->GetExtensionsService();
112 CHECK(extensions_service);
113 Extension* extension =
114 extensions_service->GetExtensionById(id, true);
115 if (extension && !IsExtensionSyncable(*extension)) {
116 LOG(WARNING) << "Not updating unsyncable extension " << id;
117 return;
118 }
105 StopObserving(); 119 StopObserving();
106 extension_model_associator_->OnServerUpdate(specifics); 120 extension_model_associator_->OnServerUpdate(specifics, extension);
107 StartObserving(); 121 StartObserving();
108 break; 122 break;
109 } 123 }
110 case sync_api::SyncManager::ChangeRecord::ACTION_DELETE: { 124 case sync_api::SyncManager::ChangeRecord::ACTION_DELETE: {
111 StopObserving(); 125 if (!change.specifics.HasExtension(sync_pb::extension)) {
112 if (change.specifics.HasExtension(sync_pb::extension)) {
113 extension_model_associator_->OnServerRemove(
114 change.specifics.GetExtension(sync_pb::extension).id());
115 } else {
116 std::stringstream error; 126 std::stringstream error;
117 error << "Could not get extension ID for deleted node " 127 error << "Could not get extension ID for delete node "
118 << change.id; 128 << change.id;
119 error_handler()->OnUnrecoverableError(FROM_HERE, error.str()); 129 error_handler()->OnUnrecoverableError(FROM_HERE, error.str());
120 LOG(DFATAL) << error.str(); 130 LOG(DFATAL) << error.str();
131 return;
121 } 132 }
133 const std::string& id =
134 change.specifics.GetExtension(sync_pb::extension).id();
135 CHECK(profile_);
136 ExtensionsService* extensions_service =
137 profile_->GetExtensionsService();
138 CHECK(extensions_service);
139 Extension* extension =
140 extensions_service->GetExtensionById(id, true);
141 if (!extension) {
142 LOG(ERROR) << "Trying to uninstall nonexistent extension " << id
143 << " for delete node " << change.id;
144 return;
145 }
146 if (!IsExtensionSyncable(*extension)) {
147 LOG(WARNING) << "Not uninstalling unsyncable extension " << id
148 << " for delete node " << change.id;
149 return;
150 }
151 StopObserving();
152 extensions_service->UninstallExtension(id, false);
122 StartObserving(); 153 StartObserving();
123 break; 154 break;
124 } 155 }
125 } 156 }
126 } 157 }
127 } 158 }
128 159
129 void ExtensionChangeProcessor::StartImpl(Profile* profile) { 160 void ExtensionChangeProcessor::StartImpl(Profile* profile) {
130 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); 161 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
131 DCHECK(profile); 162 DCHECK(profile);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 } 195 }
165 196
166 void ExtensionChangeProcessor::StopObserving() { 197 void ExtensionChangeProcessor::StopObserving() {
167 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); 198 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
168 DCHECK(profile_); 199 DCHECK(profile_);
169 LOG(INFO) << "Unobserving all notifications"; 200 LOG(INFO) << "Unobserving all notifications";
170 notification_registrar_.RemoveAll(); 201 notification_registrar_.RemoveAll();
171 } 202 }
172 203
173 } // namespace browser_sync 204 } // namespace browser_sync
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extensions_service_unittest.cc ('k') | chrome/browser/sync/glue/extension_model_associator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698