Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 48 #include "chrome/browser/supervised_user/supervised_user_service_factory.h" | 48 #include "chrome/browser/supervised_user/supervised_user_service_factory.h" |
| 49 #endif | 49 #endif |
| 50 | 50 |
| 51 using extensions::AppSorting; | 51 using extensions::AppSorting; |
| 52 using extensions::Extension; | 52 using extensions::Extension; |
| 53 using extensions::ExtensionPrefs; | 53 using extensions::ExtensionPrefs; |
| 54 using extensions::ExtensionSyncData; | 54 using extensions::ExtensionSyncData; |
| 55 using extensions::ExtensionSystem; | 55 using extensions::ExtensionSystem; |
| 56 using extensions::Manifest; | 56 using extensions::Manifest; |
| 57 using extensions::PermissionSet; | 57 using extensions::PermissionSet; |
| 58 using syncer::SyncChange; | |
| 59 using syncer::SyncChangeList; | |
| 60 | |
| 61 namespace { | |
| 58 | 62 |
| 59 const char good0[] = "behllobkkfkfnphdnhnkndlbkcpglgmj"; | 63 const char good0[] = "behllobkkfkfnphdnhnkndlbkcpglgmj"; |
| 60 const char good2[] = "bjafgdebaacbbbecmhlhpofkepfkgcpa"; | 64 const char good2[] = "bjafgdebaacbbbecmhlhpofkepfkgcpa"; |
| 61 const char good_crx[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; | 65 const char good_crx[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; |
| 62 const char page_action[] = "obcimlgaoabeegjmmpldobjndiealpln"; | 66 const char page_action[] = "obcimlgaoabeegjmmpldobjndiealpln"; |
| 63 const char theme2_crx[] = "pjpgmfcmabopnnfonnhmdjglfpjjfkbf"; | 67 const char theme2_crx[] = "pjpgmfcmabopnnfonnhmdjglfpjjfkbf"; |
| 64 | 68 |
| 69 SyncChangeList MakeSyncChangeList(const std::string& id, | |
|
Devlin
2015/12/02 17:24:50
Doesn't bother me much, but isn't the id in the sp
Marc Treib
2015/12/03 09:29:41
Hm. Yes, but it's in the ExtensionSpecifics, so we
| |
| 70 const sync_pb::EntitySpecifics& specifics, | |
| 71 SyncChange::SyncChangeType change_type) { | |
| 72 syncer::SyncData sync_data = | |
| 73 syncer::SyncData::CreateLocalData(id, "Name", specifics); | |
| 74 SyncChange sync_change(FROM_HERE, change_type, sync_data); | |
| 75 return SyncChangeList(1, sync_change); | |
|
Devlin
2015/12/02 17:24:50
nit: could even inline sync_change here.
Marc Treib
2015/12/03 09:29:41
Done.
| |
| 76 } | |
| 77 | |
| 78 } // namespace | |
| 79 | |
| 65 class ExtensionServiceSyncTest | 80 class ExtensionServiceSyncTest |
| 66 : public extensions::ExtensionServiceTestWithInstall { | 81 : public extensions::ExtensionServiceTestWithInstall { |
| 67 public: | 82 public: |
| 68 void MockSyncStartFlare(bool* was_called, | 83 void MockSyncStartFlare(bool* was_called, |
| 69 syncer::ModelType* model_type_passed_in, | 84 syncer::ModelType* model_type_passed_in, |
| 70 syncer::ModelType model_type) { | 85 syncer::ModelType model_type) { |
| 71 *was_called = true; | 86 *was_called = true; |
| 72 *model_type_passed_in = model_type; | 87 *model_type_passed_in = model_type; |
| 73 } | 88 } |
| 74 | 89 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 154 | 169 |
| 155 EXPECT_TRUE(flare_was_called); | 170 EXPECT_TRUE(flare_was_called); |
| 156 EXPECT_EQ(syncer::EXTENSIONS, triggered_type); | 171 EXPECT_EQ(syncer::EXTENSIONS, triggered_type); |
| 157 | 172 |
| 158 // Reset. | 173 // Reset. |
| 159 flare_was_called = false; | 174 flare_was_called = false; |
| 160 triggered_type = syncer::UNSPECIFIED; | 175 triggered_type = syncer::UNSPECIFIED; |
| 161 | 176 |
| 162 // Once sync starts, flare should no longer be invoked. | 177 // Once sync starts, flare should no longer be invoked. |
| 163 extension_sync_service()->MergeDataAndStartSyncing( | 178 extension_sync_service()->MergeDataAndStartSyncing( |
| 164 syncer::EXTENSIONS, | 179 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 165 syncer::SyncDataList(), | 180 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
|
Devlin
2015/12/02 17:24:50
nitty nit: even though it doesn't matter, prefer e
Marc Treib
2015/12/03 09:29:41
Done. (Is there anything in the style guide about
Devlin
2015/12/03 16:55:27
Probably not, except as it pertains to POD structs
| |
| 166 scoped_ptr<syncer::SyncChangeProcessor>( | 181 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 167 new syncer::FakeSyncChangeProcessor), | |
| 168 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 169 path = data_dir().AppendASCII("page_action.crx"); | 182 path = data_dir().AppendASCII("page_action.crx"); |
| 170 InstallCRX(path, INSTALL_NEW); | 183 InstallCRX(path, INSTALL_NEW); |
| 171 EXPECT_FALSE(flare_was_called); | 184 EXPECT_FALSE(flare_was_called); |
| 172 ASSERT_EQ(syncer::UNSPECIFIED, triggered_type); | 185 ASSERT_EQ(syncer::UNSPECIFIED, triggered_type); |
| 173 } | 186 } |
| 174 | 187 |
| 175 TEST_F(ExtensionServiceSyncTest, DisableExtensionFromSync) { | 188 TEST_F(ExtensionServiceSyncTest, DisableExtensionFromSync) { |
| 176 // Start the extensions service with one external extension already installed. | 189 // Start the extensions service with one external extension already installed. |
| 177 base::FilePath source_install_dir = | 190 base::FilePath source_install_dir = |
| 178 data_dir().AppendASCII("good").AppendASCII("Extensions"); | 191 data_dir().AppendASCII("good").AppendASCII("Extensions"); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 191 | 204 |
| 192 ASSERT_EQ(3u, loaded_.size()); | 205 ASSERT_EQ(3u, loaded_.size()); |
| 193 | 206 |
| 194 // We start enabled. | 207 // We start enabled. |
| 195 const Extension* extension = service()->GetExtensionById(good0, true); | 208 const Extension* extension = service()->GetExtensionById(good0, true); |
| 196 ASSERT_TRUE(extension); | 209 ASSERT_TRUE(extension); |
| 197 ASSERT_TRUE(service()->IsExtensionEnabled(good0)); | 210 ASSERT_TRUE(service()->IsExtensionEnabled(good0)); |
| 198 | 211 |
| 199 // Sync starts up. | 212 // Sync starts up. |
| 200 extension_sync_service()->MergeDataAndStartSyncing( | 213 extension_sync_service()->MergeDataAndStartSyncing( |
| 201 syncer::EXTENSIONS, | 214 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 202 syncer::SyncDataList(), | |
| 203 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), | 215 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 204 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | 216 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 205 | 217 |
| 206 // Then sync data arrives telling us to disable |good0|. | 218 // Then sync data arrives telling us to disable |good0|. |
| 207 ExtensionSyncData disable_good_crx(*extension, false, | 219 ExtensionSyncData disable_good_crx(*extension, false, |
| 208 Extension::DISABLE_USER_ACTION, false, | 220 Extension::DISABLE_USER_ACTION, false, |
| 209 false, ExtensionSyncData::BOOLEAN_UNSET); | 221 false, ExtensionSyncData::BOOLEAN_UNSET); |
| 210 syncer::SyncChange sync_change(FROM_HERE, | 222 SyncChangeList list( |
| 211 syncer::SyncChange::ACTION_UPDATE, | 223 1, disable_good_crx.GetSyncChange(SyncChange::ACTION_UPDATE)); |
| 212 disable_good_crx.GetSyncData()); | |
| 213 syncer::SyncChangeList list(1, sync_change); | |
| 214 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 224 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 215 | 225 |
| 216 ASSERT_FALSE(service()->IsExtensionEnabled(good0)); | 226 ASSERT_FALSE(service()->IsExtensionEnabled(good0)); |
| 217 } | 227 } |
| 218 | 228 |
| 219 TEST_F(ExtensionServiceSyncTest, IgnoreSyncChangesWhenLocalStateIsMoreRecent) { | 229 TEST_F(ExtensionServiceSyncTest, IgnoreSyncChangesWhenLocalStateIsMoreRecent) { |
| 220 // Start the extension service with three extensions already installed. | 230 // Start the extension service with three extensions already installed. |
| 221 base::FilePath source_install_dir = | 231 base::FilePath source_install_dir = |
| 222 data_dir().AppendASCII("good").AppendASCII("Extensions"); | 232 data_dir().AppendASCII("good").AppendASCII("Extensions"); |
| 223 base::FilePath pref_path = | 233 base::FilePath pref_path = |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 308 // Simulate various incoming sync changes, and make sure they don't result in | 318 // Simulate various incoming sync changes, and make sure they don't result in |
| 309 // any outgoing changes. | 319 // any outgoing changes. |
| 310 | 320 |
| 311 { | 321 { |
| 312 const Extension* extension = service()->GetExtensionById(good0, true); | 322 const Extension* extension = service()->GetExtensionById(good0, true); |
| 313 ASSERT_TRUE(extension); | 323 ASSERT_TRUE(extension); |
| 314 | 324 |
| 315 // Disable the extension. | 325 // Disable the extension. |
| 316 ExtensionSyncData data(*extension, false, Extension::DISABLE_USER_ACTION, | 326 ExtensionSyncData data(*extension, false, Extension::DISABLE_USER_ACTION, |
| 317 false, false, ExtensionSyncData::BOOLEAN_UNSET); | 327 false, false, ExtensionSyncData::BOOLEAN_UNSET); |
| 318 syncer::SyncChangeList list( | 328 SyncChangeList list(1, data.GetSyncChange(SyncChange::ACTION_UPDATE)); |
| 319 1, data.GetSyncChange(syncer::SyncChange::ACTION_UPDATE)); | |
| 320 | 329 |
| 321 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 330 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 322 | 331 |
| 323 EXPECT_TRUE(processor->changes().empty()); | 332 EXPECT_TRUE(processor->changes().empty()); |
| 324 } | 333 } |
| 325 | 334 |
| 326 { | 335 { |
| 327 const Extension* extension = service()->GetExtensionById(good0, true); | 336 const Extension* extension = service()->GetExtensionById(good0, true); |
| 328 ASSERT_TRUE(extension); | 337 ASSERT_TRUE(extension); |
| 329 | 338 |
| 330 // Set incognito enabled to true. | 339 // Set incognito enabled to true. |
| 331 ExtensionSyncData data(*extension, false, Extension::DISABLE_NONE, true, | 340 ExtensionSyncData data(*extension, false, Extension::DISABLE_NONE, true, |
| 332 false, ExtensionSyncData::BOOLEAN_UNSET); | 341 false, ExtensionSyncData::BOOLEAN_UNSET); |
| 333 syncer::SyncChangeList list( | 342 SyncChangeList list(1, data.GetSyncChange(SyncChange::ACTION_UPDATE)); |
| 334 1, data.GetSyncChange(syncer::SyncChange::ACTION_UPDATE)); | |
| 335 | 343 |
| 336 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 344 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 337 | 345 |
| 338 EXPECT_TRUE(processor->changes().empty()); | 346 EXPECT_TRUE(processor->changes().empty()); |
| 339 } | 347 } |
| 340 | 348 |
| 341 { | 349 { |
| 342 const Extension* extension = service()->GetExtensionById(good0, true); | 350 const Extension* extension = service()->GetExtensionById(good0, true); |
| 343 ASSERT_TRUE(extension); | 351 ASSERT_TRUE(extension); |
| 344 | 352 |
| 345 // Add another disable reason. | 353 // Add another disable reason. |
| 346 ExtensionSyncData data(*extension, false, | 354 ExtensionSyncData data(*extension, false, |
| 347 Extension::DISABLE_USER_ACTION | | 355 Extension::DISABLE_USER_ACTION | |
| 348 Extension::DISABLE_PERMISSIONS_INCREASE, | 356 Extension::DISABLE_PERMISSIONS_INCREASE, |
| 349 false, false, ExtensionSyncData::BOOLEAN_UNSET); | 357 false, false, ExtensionSyncData::BOOLEAN_UNSET); |
| 350 syncer::SyncChangeList list( | 358 SyncChangeList list(1, data.GetSyncChange(SyncChange::ACTION_UPDATE)); |
| 351 1, data.GetSyncChange(syncer::SyncChange::ACTION_UPDATE)); | |
| 352 | 359 |
| 353 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 360 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 354 | 361 |
| 355 EXPECT_TRUE(processor->changes().empty()); | 362 EXPECT_TRUE(processor->changes().empty()); |
| 356 } | 363 } |
| 357 | 364 |
| 358 { | 365 { |
| 359 const Extension* extension = service()->GetExtensionById(good0, true); | 366 const Extension* extension = service()->GetExtensionById(good0, true); |
| 360 ASSERT_TRUE(extension); | 367 ASSERT_TRUE(extension); |
| 361 | 368 |
| 362 // Uninstall the extension. | 369 // Uninstall the extension. |
| 363 ExtensionSyncData data(*extension, false, | 370 ExtensionSyncData data(*extension, false, |
| 364 Extension::DISABLE_USER_ACTION | | 371 Extension::DISABLE_USER_ACTION | |
| 365 Extension::DISABLE_PERMISSIONS_INCREASE, | 372 Extension::DISABLE_PERMISSIONS_INCREASE, |
| 366 false, false, ExtensionSyncData::BOOLEAN_UNSET); | 373 false, false, ExtensionSyncData::BOOLEAN_UNSET); |
| 367 syncer::SyncChangeList list( | 374 SyncChangeList list(1, data.GetSyncChange(SyncChange::ACTION_DELETE)); |
| 368 1, data.GetSyncChange(syncer::SyncChange::ACTION_DELETE)); | |
| 369 | 375 |
| 370 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 376 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 371 | 377 |
| 372 EXPECT_TRUE(processor->changes().empty()); | 378 EXPECT_TRUE(processor->changes().empty()); |
| 373 } | 379 } |
| 374 } | 380 } |
| 375 | 381 |
| 376 TEST_F(ExtensionServiceSyncTest, GetSyncData) { | 382 TEST_F(ExtensionServiceSyncTest, GetSyncData) { |
| 377 InitializeEmptyExtensionService(); | 383 InitializeEmptyExtensionService(); |
| 378 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); | 384 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); |
| 379 const Extension* extension = service()->GetInstalledExtension(good_crx); | 385 const Extension* extension = service()->GetInstalledExtension(good_crx); |
| 380 ASSERT_TRUE(extension); | 386 ASSERT_TRUE(extension); |
| 381 | 387 |
| 382 extension_sync_service()->MergeDataAndStartSyncing( | 388 extension_sync_service()->MergeDataAndStartSyncing( |
| 383 syncer::EXTENSIONS, | 389 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 384 syncer::SyncDataList(), | 390 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 385 scoped_ptr<syncer::SyncChangeProcessor>( | 391 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 386 new syncer::FakeSyncChangeProcessor), | |
| 387 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 388 | 392 |
| 389 syncer::SyncDataList list = | 393 syncer::SyncDataList list = |
| 390 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); | 394 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); |
| 391 ASSERT_EQ(list.size(), 1U); | 395 ASSERT_EQ(list.size(), 1U); |
| 392 scoped_ptr<ExtensionSyncData> data = | 396 scoped_ptr<ExtensionSyncData> data = |
| 393 ExtensionSyncData::CreateFromSyncData(list[0]); | 397 ExtensionSyncData::CreateFromSyncData(list[0]); |
| 394 ASSERT_TRUE(data.get()); | 398 ASSERT_TRUE(data.get()); |
| 395 EXPECT_EQ(extension->id(), data->id()); | 399 EXPECT_EQ(extension->id(), data->id()); |
| 396 EXPECT_FALSE(data->uninstalled()); | 400 EXPECT_FALSE(data->uninstalled()); |
| 397 EXPECT_EQ(service()->IsExtensionEnabled(good_crx), data->enabled()); | 401 EXPECT_EQ(service()->IsExtensionEnabled(good_crx), data->enabled()); |
| 398 EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()), | 402 EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()), |
| 399 data->incognito_enabled()); | 403 data->incognito_enabled()); |
| 400 EXPECT_EQ(ExtensionSyncData::BOOLEAN_UNSET, data->all_urls_enabled()); | 404 EXPECT_EQ(ExtensionSyncData::BOOLEAN_UNSET, data->all_urls_enabled()); |
| 401 EXPECT_TRUE(data->version().Equals(*extension->version())); | 405 EXPECT_TRUE(data->version().Equals(*extension->version())); |
| 402 EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension), | 406 EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension), |
| 403 data->update_url()); | 407 data->update_url()); |
| 404 EXPECT_EQ(extension->name(), data->name()); | 408 EXPECT_EQ(extension->name(), data->name()); |
| 405 } | 409 } |
| 406 | 410 |
| 407 TEST_F(ExtensionServiceSyncTest, GetSyncDataDisableReasons) { | 411 TEST_F(ExtensionServiceSyncTest, GetSyncDataDisableReasons) { |
| 408 InitializeEmptyExtensionService(); | 412 InitializeEmptyExtensionService(); |
| 409 const Extension* extension = | 413 const Extension* extension = |
| 410 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); | 414 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); |
| 411 ASSERT_TRUE(extension); | 415 ASSERT_TRUE(extension); |
| 412 | 416 |
| 413 syncer::FakeSyncChangeProcessor processor; | |
| 414 extension_sync_service()->MergeDataAndStartSyncing( | 417 extension_sync_service()->MergeDataAndStartSyncing( |
| 415 syncer::EXTENSIONS, | 418 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 416 syncer::SyncDataList(), | 419 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 417 scoped_ptr<syncer::SyncChangeProcessor>( | 420 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 418 new syncer::FakeSyncChangeProcessor), | |
| 419 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 420 | 421 |
| 421 { | 422 { |
| 422 syncer::SyncDataList list = | 423 syncer::SyncDataList list = |
| 423 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); | 424 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); |
| 424 ASSERT_EQ(list.size(), 1U); | 425 ASSERT_EQ(list.size(), 1U); |
| 425 scoped_ptr<ExtensionSyncData> data = | 426 scoped_ptr<ExtensionSyncData> data = |
| 426 ExtensionSyncData::CreateFromSyncData(list[0]); | 427 ExtensionSyncData::CreateFromSyncData(list[0]); |
| 427 ASSERT_TRUE(data.get()); | 428 ASSERT_TRUE(data.get()); |
| 428 EXPECT_TRUE(data->enabled()); | 429 EXPECT_TRUE(data->enabled()); |
| 429 EXPECT_TRUE(data->supports_disable_reasons()); | 430 EXPECT_TRUE(data->supports_disable_reasons()); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 478 service()->EnableExtension(good_crx); | 479 service()->EnableExtension(good_crx); |
| 479 } | 480 } |
| 480 | 481 |
| 481 TEST_F(ExtensionServiceSyncTest, GetSyncDataTerminated) { | 482 TEST_F(ExtensionServiceSyncTest, GetSyncDataTerminated) { |
| 482 InitializeEmptyExtensionService(); | 483 InitializeEmptyExtensionService(); |
| 483 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); | 484 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); |
| 484 TerminateExtension(good_crx); | 485 TerminateExtension(good_crx); |
| 485 const Extension* extension = service()->GetInstalledExtension(good_crx); | 486 const Extension* extension = service()->GetInstalledExtension(good_crx); |
| 486 ASSERT_TRUE(extension); | 487 ASSERT_TRUE(extension); |
| 487 | 488 |
| 488 syncer::FakeSyncChangeProcessor processor; | |
| 489 extension_sync_service()->MergeDataAndStartSyncing( | 489 extension_sync_service()->MergeDataAndStartSyncing( |
| 490 syncer::EXTENSIONS, | 490 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 491 syncer::SyncDataList(), | 491 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 492 scoped_ptr<syncer::SyncChangeProcessor>( | 492 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 493 new syncer::FakeSyncChangeProcessor), | |
| 494 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 495 | 493 |
| 496 syncer::SyncDataList list = | 494 syncer::SyncDataList list = |
| 497 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); | 495 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); |
| 498 ASSERT_EQ(list.size(), 1U); | 496 ASSERT_EQ(list.size(), 1U); |
| 499 scoped_ptr<ExtensionSyncData> data = | 497 scoped_ptr<ExtensionSyncData> data = |
| 500 ExtensionSyncData::CreateFromSyncData(list[0]); | 498 ExtensionSyncData::CreateFromSyncData(list[0]); |
| 501 ASSERT_TRUE(data.get()); | 499 ASSERT_TRUE(data.get()); |
| 502 EXPECT_EQ(extension->id(), data->id()); | 500 EXPECT_EQ(extension->id(), data->id()); |
| 503 EXPECT_FALSE(data->uninstalled()); | 501 EXPECT_FALSE(data->uninstalled()); |
| 504 EXPECT_EQ(service()->IsExtensionEnabled(good_crx), data->enabled()); | 502 EXPECT_EQ(service()->IsExtensionEnabled(good_crx), data->enabled()); |
| 505 EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()), | 503 EXPECT_EQ(extensions::util::IsIncognitoEnabled(good_crx, profile()), |
| 506 data->incognito_enabled()); | 504 data->incognito_enabled()); |
| 507 EXPECT_EQ(ExtensionSyncData::BOOLEAN_UNSET, data->all_urls_enabled()); | 505 EXPECT_EQ(ExtensionSyncData::BOOLEAN_UNSET, data->all_urls_enabled()); |
| 508 EXPECT_TRUE(data->version().Equals(*extension->version())); | 506 EXPECT_TRUE(data->version().Equals(*extension->version())); |
| 509 EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension), | 507 EXPECT_EQ(extensions::ManifestURL::GetUpdateURL(extension), |
| 510 data->update_url()); | 508 data->update_url()); |
| 511 EXPECT_EQ(extension->name(), data->name()); | 509 EXPECT_EQ(extension->name(), data->name()); |
| 512 } | 510 } |
| 513 | 511 |
| 514 TEST_F(ExtensionServiceSyncTest, GetSyncDataFilter) { | 512 TEST_F(ExtensionServiceSyncTest, GetSyncDataFilter) { |
| 515 InitializeEmptyExtensionService(); | 513 InitializeEmptyExtensionService(); |
| 516 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); | 514 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); |
| 517 const Extension* extension = service()->GetInstalledExtension(good_crx); | 515 const Extension* extension = service()->GetInstalledExtension(good_crx); |
| 518 ASSERT_TRUE(extension); | 516 ASSERT_TRUE(extension); |
| 519 | 517 |
| 520 syncer::FakeSyncChangeProcessor processor; | |
| 521 extension_sync_service()->MergeDataAndStartSyncing( | 518 extension_sync_service()->MergeDataAndStartSyncing( |
| 522 syncer::APPS, | 519 syncer::APPS, syncer::SyncDataList(), |
| 523 syncer::SyncDataList(), | 520 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 524 scoped_ptr<syncer::SyncChangeProcessor>( | 521 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 525 new syncer::FakeSyncChangeProcessor), | |
| 526 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 527 | 522 |
| 528 syncer::SyncDataList list = | 523 syncer::SyncDataList list = |
| 529 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); | 524 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); |
| 530 ASSERT_EQ(list.size(), 0U); | 525 ASSERT_EQ(list.size(), 0U); |
| 531 } | 526 } |
| 532 | 527 |
| 533 TEST_F(ExtensionServiceSyncTest, GetSyncExtensionDataUserSettings) { | 528 TEST_F(ExtensionServiceSyncTest, GetSyncExtensionDataUserSettings) { |
| 534 InitializeEmptyExtensionService(); | 529 InitializeEmptyExtensionService(); |
| 535 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); | 530 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); |
| 536 const Extension* extension = service()->GetInstalledExtension(good_crx); | 531 const Extension* extension = service()->GetInstalledExtension(good_crx); |
| 537 ASSERT_TRUE(extension); | 532 ASSERT_TRUE(extension); |
| 538 | 533 |
| 539 syncer::FakeSyncChangeProcessor processor; | |
| 540 extension_sync_service()->MergeDataAndStartSyncing( | 534 extension_sync_service()->MergeDataAndStartSyncing( |
| 541 syncer::EXTENSIONS, | 535 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 542 syncer::SyncDataList(), | 536 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 543 scoped_ptr<syncer::SyncChangeProcessor>( | 537 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 544 new syncer::FakeSyncChangeProcessor), | |
| 545 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 546 | 538 |
| 547 { | 539 { |
| 548 syncer::SyncDataList list = | 540 syncer::SyncDataList list = |
| 549 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); | 541 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); |
| 550 ASSERT_EQ(list.size(), 1U); | 542 ASSERT_EQ(list.size(), 1U); |
| 551 scoped_ptr<ExtensionSyncData> data = | 543 scoped_ptr<ExtensionSyncData> data = |
| 552 ExtensionSyncData::CreateFromSyncData(list[0]); | 544 ExtensionSyncData::CreateFromSyncData(list[0]); |
| 553 ASSERT_TRUE(data.get()); | 545 ASSERT_TRUE(data.get()); |
| 554 EXPECT_TRUE(data->enabled()); | 546 EXPECT_TRUE(data->enabled()); |
| 555 EXPECT_FALSE(data->incognito_enabled()); | 547 EXPECT_FALSE(data->incognito_enabled()); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 600 } | 592 } |
| 601 } | 593 } |
| 602 | 594 |
| 603 TEST_F(ExtensionServiceSyncTest, SyncForUninstalledExternalExtension) { | 595 TEST_F(ExtensionServiceSyncTest, SyncForUninstalledExternalExtension) { |
| 604 InitializeEmptyExtensionService(); | 596 InitializeEmptyExtensionService(); |
| 605 InstallCRXWithLocation( | 597 InstallCRXWithLocation( |
| 606 data_dir().AppendASCII("good.crx"), Manifest::EXTERNAL_PREF, INSTALL_NEW); | 598 data_dir().AppendASCII("good.crx"), Manifest::EXTERNAL_PREF, INSTALL_NEW); |
| 607 const Extension* extension = service()->GetInstalledExtension(good_crx); | 599 const Extension* extension = service()->GetInstalledExtension(good_crx); |
| 608 ASSERT_TRUE(extension); | 600 ASSERT_TRUE(extension); |
| 609 | 601 |
| 610 syncer::FakeSyncChangeProcessor processor; | |
| 611 extension_sync_service()->MergeDataAndStartSyncing( | 602 extension_sync_service()->MergeDataAndStartSyncing( |
| 612 syncer::EXTENSIONS, | 603 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 613 syncer::SyncDataList(), | 604 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 614 scoped_ptr<syncer::SyncChangeProcessor>( | 605 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 615 new syncer::FakeSyncChangeProcessor), | |
| 616 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 617 | 606 |
| 618 UninstallExtension(good_crx, false); | 607 UninstallExtension(good_crx, false); |
| 619 EXPECT_TRUE( | 608 EXPECT_TRUE( |
| 620 ExtensionPrefs::Get(profile())->IsExternalExtensionUninstalled(good_crx)); | 609 ExtensionPrefs::Get(profile())->IsExternalExtensionUninstalled(good_crx)); |
| 621 | 610 |
| 622 sync_pb::EntitySpecifics specifics; | 611 sync_pb::EntitySpecifics specifics; |
| 623 sync_pb::AppSpecifics* app_specifics = specifics.mutable_app(); | 612 sync_pb::AppSpecifics* app_specifics = specifics.mutable_app(); |
| 624 sync_pb::ExtensionSpecifics* extension_specifics = | 613 sync_pb::ExtensionSpecifics* extension_specifics = |
| 625 app_specifics->mutable_extension(); | 614 app_specifics->mutable_extension(); |
| 626 extension_specifics->set_id(good_crx); | 615 extension_specifics->set_id(good_crx); |
| 627 extension_specifics->set_version("1.0"); | 616 extension_specifics->set_version("1.0"); |
| 628 extension_specifics->set_enabled(true); | 617 extension_specifics->set_enabled(true); |
| 629 | 618 |
| 630 syncer::SyncData sync_data = | 619 SyncChangeList list = |
| 631 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 620 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 632 syncer::SyncChange sync_change(FROM_HERE, | |
| 633 syncer::SyncChange::ACTION_UPDATE, | |
| 634 sync_data); | |
| 635 syncer::SyncChangeList list(1); | |
| 636 list[0] = sync_change; | |
| 637 | 621 |
| 638 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 622 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 639 EXPECT_TRUE( | 623 EXPECT_TRUE( |
| 640 ExtensionPrefs::Get(profile())->IsExternalExtensionUninstalled(good_crx)); | 624 ExtensionPrefs::Get(profile())->IsExternalExtensionUninstalled(good_crx)); |
| 641 } | 625 } |
| 642 | 626 |
| 643 TEST_F(ExtensionServiceSyncTest, GetSyncAppDataUserSettings) { | 627 TEST_F(ExtensionServiceSyncTest, GetSyncAppDataUserSettings) { |
| 644 InitializeEmptyExtensionService(); | 628 InitializeEmptyExtensionService(); |
| 645 const Extension* app = | 629 const Extension* app = |
| 646 PackAndInstallCRX(data_dir().AppendASCII("app"), INSTALL_NEW); | 630 PackAndInstallCRX(data_dir().AppendASCII("app"), INSTALL_NEW); |
| 647 ASSERT_TRUE(app); | 631 ASSERT_TRUE(app); |
| 648 ASSERT_TRUE(app->is_app()); | 632 ASSERT_TRUE(app->is_app()); |
| 649 | 633 |
| 650 syncer::FakeSyncChangeProcessor processor; | |
| 651 extension_sync_service()->MergeDataAndStartSyncing( | 634 extension_sync_service()->MergeDataAndStartSyncing( |
| 652 syncer::APPS, | 635 syncer::APPS, syncer::SyncDataList(), |
| 653 syncer::SyncDataList(), | 636 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 654 scoped_ptr<syncer::SyncChangeProcessor>( | 637 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 655 new syncer::FakeSyncChangeProcessor), | |
| 656 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 657 | 638 |
| 658 syncer::StringOrdinal initial_ordinal = | 639 syncer::StringOrdinal initial_ordinal = |
| 659 syncer::StringOrdinal::CreateInitialOrdinal(); | 640 syncer::StringOrdinal::CreateInitialOrdinal(); |
| 660 { | 641 { |
| 661 syncer::SyncDataList list = | 642 syncer::SyncDataList list = |
| 662 extension_sync_service()->GetAllSyncData(syncer::APPS); | 643 extension_sync_service()->GetAllSyncData(syncer::APPS); |
| 663 ASSERT_EQ(list.size(), 1U); | 644 ASSERT_EQ(list.size(), 1U); |
| 664 | 645 |
| 665 scoped_ptr<ExtensionSyncData> app_sync_data = | 646 scoped_ptr<ExtensionSyncData> app_sync_data = |
| 666 ExtensionSyncData::CreateFromSyncData(list[0]); | 647 ExtensionSyncData::CreateFromSyncData(list[0]); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 705 const size_t kAppCount = 3; | 686 const size_t kAppCount = 3; |
| 706 const Extension* apps[kAppCount]; | 687 const Extension* apps[kAppCount]; |
| 707 apps[0] = PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW); | 688 apps[0] = PackAndInstallCRX(data_dir().AppendASCII("app1"), INSTALL_NEW); |
| 708 apps[1] = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW); | 689 apps[1] = PackAndInstallCRX(data_dir().AppendASCII("app2"), INSTALL_NEW); |
| 709 apps[2] = PackAndInstallCRX(data_dir().AppendASCII("app4"), INSTALL_NEW); | 690 apps[2] = PackAndInstallCRX(data_dir().AppendASCII("app4"), INSTALL_NEW); |
| 710 for (size_t i = 0; i < kAppCount; ++i) { | 691 for (size_t i = 0; i < kAppCount; ++i) { |
| 711 ASSERT_TRUE(apps[i]); | 692 ASSERT_TRUE(apps[i]); |
| 712 ASSERT_TRUE(apps[i]->is_app()); | 693 ASSERT_TRUE(apps[i]->is_app()); |
| 713 } | 694 } |
| 714 | 695 |
| 715 syncer::FakeSyncChangeProcessor processor; | |
| 716 extension_sync_service()->MergeDataAndStartSyncing( | 696 extension_sync_service()->MergeDataAndStartSyncing( |
| 717 syncer::APPS, | 697 syncer::APPS, syncer::SyncDataList(), |
| 718 syncer::SyncDataList(), | 698 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 719 scoped_ptr<syncer::SyncChangeProcessor>( | 699 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 720 new syncer::FakeSyncChangeProcessor), | |
| 721 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 722 | 700 |
| 723 ExtensionSystem::Get(service()->GetBrowserContext()) | 701 ExtensionSystem::Get(service()->GetBrowserContext()) |
| 724 ->app_sorting() | 702 ->app_sorting() |
| 725 ->OnExtensionMoved(apps[0]->id(), apps[1]->id(), apps[2]->id()); | 703 ->OnExtensionMoved(apps[0]->id(), apps[1]->id(), apps[2]->id()); |
| 726 { | 704 { |
| 727 syncer::SyncDataList list = | 705 syncer::SyncDataList list = |
| 728 extension_sync_service()->GetAllSyncData(syncer::APPS); | 706 extension_sync_service()->GetAllSyncData(syncer::APPS); |
| 729 ASSERT_EQ(list.size(), 3U); | 707 ASSERT_EQ(list.size(), 3U); |
| 730 | 708 |
| 731 scoped_ptr<ExtensionSyncData> data[kAppCount]; | 709 scoped_ptr<ExtensionSyncData> data[kAppCount]; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 750 } | 728 } |
| 751 } | 729 } |
| 752 | 730 |
| 753 TEST_F(ExtensionServiceSyncTest, GetSyncDataList) { | 731 TEST_F(ExtensionServiceSyncTest, GetSyncDataList) { |
| 754 InitializeEmptyExtensionService(); | 732 InitializeEmptyExtensionService(); |
| 755 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); | 733 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); |
| 756 InstallCRX(data_dir().AppendASCII("page_action.crx"), INSTALL_NEW); | 734 InstallCRX(data_dir().AppendASCII("page_action.crx"), INSTALL_NEW); |
| 757 InstallCRX(data_dir().AppendASCII("theme.crx"), INSTALL_NEW); | 735 InstallCRX(data_dir().AppendASCII("theme.crx"), INSTALL_NEW); |
| 758 InstallCRX(data_dir().AppendASCII("theme2.crx"), INSTALL_NEW); | 736 InstallCRX(data_dir().AppendASCII("theme2.crx"), INSTALL_NEW); |
| 759 | 737 |
| 760 syncer::FakeSyncChangeProcessor processor; | |
| 761 extension_sync_service()->MergeDataAndStartSyncing( | 738 extension_sync_service()->MergeDataAndStartSyncing( |
| 762 syncer::APPS, | 739 syncer::APPS, syncer::SyncDataList(), |
| 763 syncer::SyncDataList(), | 740 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 764 scoped_ptr<syncer::SyncChangeProcessor>( | 741 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 765 new syncer::FakeSyncChangeProcessor), | |
| 766 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 767 extension_sync_service()->MergeDataAndStartSyncing( | 742 extension_sync_service()->MergeDataAndStartSyncing( |
| 768 syncer::EXTENSIONS, | 743 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 769 syncer::SyncDataList(), | 744 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 770 scoped_ptr<syncer::SyncChangeProcessor>( | 745 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 771 new syncer::FakeSyncChangeProcessor), | |
| 772 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 773 | 746 |
| 774 service()->DisableExtension(page_action, Extension::DISABLE_USER_ACTION); | 747 service()->DisableExtension(page_action, Extension::DISABLE_USER_ACTION); |
| 775 TerminateExtension(theme2_crx); | 748 TerminateExtension(theme2_crx); |
| 776 | 749 |
| 777 EXPECT_EQ(0u, extension_sync_service()->GetAllSyncData(syncer::APPS).size()); | 750 EXPECT_EQ(0u, extension_sync_service()->GetAllSyncData(syncer::APPS).size()); |
| 778 EXPECT_EQ( | 751 EXPECT_EQ( |
| 779 2u, extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS).size()); | 752 2u, extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS).size()); |
| 780 } | 753 } |
| 781 | 754 |
| 782 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataUninstall) { | 755 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataUninstall) { |
| 783 InitializeEmptyExtensionService(); | 756 InitializeEmptyExtensionService(); |
| 784 syncer::FakeSyncChangeProcessor processor; | |
| 785 extension_sync_service()->MergeDataAndStartSyncing( | 757 extension_sync_service()->MergeDataAndStartSyncing( |
| 786 syncer::EXTENSIONS, | 758 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 787 syncer::SyncDataList(), | 759 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 788 scoped_ptr<syncer::SyncChangeProcessor>( | 760 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 789 new syncer::FakeSyncChangeProcessor), | |
| 790 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 791 | 761 |
| 792 sync_pb::EntitySpecifics specifics; | 762 sync_pb::EntitySpecifics specifics; |
| 793 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); | 763 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
| 794 ext_specifics->set_id(good_crx); | 764 ext_specifics->set_id(good_crx); |
| 795 ext_specifics->set_version("1.0"); | 765 ext_specifics->set_version("1.0"); |
| 796 syncer::SyncData sync_data = | 766 |
| 797 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 767 SyncChangeList list = |
| 798 syncer::SyncChange sync_change(FROM_HERE, | 768 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_DELETE); |
| 799 syncer::SyncChange::ACTION_DELETE, | |
| 800 sync_data); | |
| 801 syncer::SyncChangeList list(1); | |
| 802 list[0] = sync_change; | |
| 803 | 769 |
| 804 // Should do nothing. | 770 // Should do nothing. |
| 805 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 771 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 806 EXPECT_FALSE(service()->GetExtensionById(good_crx, true)); | 772 EXPECT_FALSE(service()->GetExtensionById(good_crx, true)); |
| 807 | 773 |
| 808 // Install the extension. | 774 // Install the extension. |
| 809 base::FilePath extension_path = data_dir().AppendASCII("good.crx"); | 775 base::FilePath extension_path = data_dir().AppendASCII("good.crx"); |
| 810 InstallCRX(extension_path, INSTALL_NEW); | 776 InstallCRX(extension_path, INSTALL_NEW); |
| 811 EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); | 777 EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); |
| 812 | 778 |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 830 sync_pb::EntitySpecifics specifics; | 796 sync_pb::EntitySpecifics specifics; |
| 831 sync_pb::AppSpecifics* app_specifics = specifics.mutable_app(); | 797 sync_pb::AppSpecifics* app_specifics = specifics.mutable_app(); |
| 832 sync_pb::ExtensionSpecifics* extension_specifics = | 798 sync_pb::ExtensionSpecifics* extension_specifics = |
| 833 app_specifics->mutable_extension(); | 799 app_specifics->mutable_extension(); |
| 834 extension_specifics->set_id(good_crx); | 800 extension_specifics->set_id(good_crx); |
| 835 extension_specifics->set_version( | 801 extension_specifics->set_version( |
| 836 service()->GetInstalledExtension(good_crx)->version()->GetString()); | 802 service()->GetInstalledExtension(good_crx)->version()->GetString()); |
| 837 | 803 |
| 838 { | 804 { |
| 839 extension_specifics->set_enabled(true); | 805 extension_specifics->set_enabled(true); |
| 840 syncer::SyncData sync_data = | 806 |
| 841 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 807 SyncChangeList list = |
| 842 syncer::SyncChange sync_change(FROM_HERE, | 808 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_DELETE); |
| 843 syncer::SyncChange::ACTION_DELETE, | |
| 844 sync_data); | |
| 845 syncer::SyncChangeList list(1); | |
| 846 list[0] = sync_change; | |
| 847 | 809 |
| 848 // Should do nothing | 810 // Should do nothing |
| 849 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 811 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 850 EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); | 812 EXPECT_TRUE(service()->GetExtensionById(good_crx, true)); |
| 851 } | 813 } |
| 852 | 814 |
| 853 { | 815 { |
| 854 extension_specifics->set_enabled(false); | 816 extension_specifics->set_enabled(false); |
| 855 syncer::SyncData sync_data = | 817 |
| 856 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 818 SyncChangeList list = |
| 857 syncer::SyncChange sync_change(FROM_HERE, | 819 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 858 syncer::SyncChange::ACTION_UPDATE, | |
| 859 sync_data); | |
| 860 syncer::SyncChangeList list(1); | |
| 861 list[0] = sync_change; | |
| 862 | 820 |
| 863 // Should again do nothing. | 821 // Should again do nothing. |
| 864 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 822 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 865 EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); | 823 EXPECT_TRUE(service()->GetExtensionById(good_crx, false)); |
| 866 } | 824 } |
| 867 } | 825 } |
| 868 | 826 |
| 869 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataSettings) { | 827 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataSettings) { |
| 870 InitializeEmptyExtensionService(); | 828 InitializeEmptyExtensionService(); |
| 871 syncer::FakeSyncChangeProcessor processor; | |
| 872 extension_sync_service()->MergeDataAndStartSyncing( | 829 extension_sync_service()->MergeDataAndStartSyncing( |
| 873 syncer::EXTENSIONS, | 830 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 874 syncer::SyncDataList(), | 831 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 875 scoped_ptr<syncer::SyncChangeProcessor>( | 832 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 876 new syncer::FakeSyncChangeProcessor), | |
| 877 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 878 | 833 |
| 879 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); | 834 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); |
| 880 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); | 835 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); |
| 881 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); | 836 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); |
| 882 EXPECT_FALSE(extensions::util::HasSetAllowedScriptingOnAllUrls( | 837 EXPECT_FALSE(extensions::util::HasSetAllowedScriptingOnAllUrls( |
| 883 good_crx, profile())); | 838 good_crx, profile())); |
| 884 const bool kDefaultAllowedScripting = | 839 const bool kDefaultAllowedScripting = |
| 885 extensions::util::DefaultAllowedScriptingOnAllUrls(); | 840 extensions::util::DefaultAllowedScriptingOnAllUrls(); |
| 886 EXPECT_EQ(kDefaultAllowedScripting, | 841 EXPECT_EQ(kDefaultAllowedScripting, |
| 887 extensions::util::AllowedScriptingOnAllUrls(good_crx, profile())); | 842 extensions::util::AllowedScriptingOnAllUrls(good_crx, profile())); |
| 888 | 843 |
| 889 sync_pb::EntitySpecifics specifics; | 844 sync_pb::EntitySpecifics specifics; |
| 890 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); | 845 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
| 891 ext_specifics->set_id(good_crx); | 846 ext_specifics->set_id(good_crx); |
| 892 ext_specifics->set_version( | 847 ext_specifics->set_version( |
| 893 service()->GetInstalledExtension(good_crx)->version()->GetString()); | 848 service()->GetInstalledExtension(good_crx)->version()->GetString()); |
| 894 ext_specifics->set_enabled(false); | 849 ext_specifics->set_enabled(false); |
| 895 | 850 |
| 896 { | 851 { |
| 897 syncer::SyncData sync_data = | 852 SyncChangeList list = |
| 898 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 853 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 899 syncer::SyncChange sync_change(FROM_HERE, | 854 |
| 900 syncer::SyncChange::ACTION_UPDATE, | |
| 901 sync_data); | |
| 902 syncer::SyncChangeList list(1); | |
| 903 list[0] = sync_change; | |
| 904 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 855 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 905 EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); | 856 EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); |
| 906 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); | 857 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); |
| 907 EXPECT_FALSE(extensions::util::HasSetAllowedScriptingOnAllUrls( | 858 EXPECT_FALSE(extensions::util::HasSetAllowedScriptingOnAllUrls( |
| 908 good_crx, profile())); | 859 good_crx, profile())); |
| 909 EXPECT_EQ(kDefaultAllowedScripting, | 860 EXPECT_EQ(kDefaultAllowedScripting, |
| 910 extensions::util::AllowedScriptingOnAllUrls(good_crx, profile())); | 861 extensions::util::AllowedScriptingOnAllUrls(good_crx, profile())); |
| 911 } | 862 } |
| 912 | 863 |
| 913 { | 864 { |
| 914 ext_specifics->set_enabled(true); | 865 ext_specifics->set_enabled(true); |
| 915 ext_specifics->set_incognito_enabled(true); | 866 ext_specifics->set_incognito_enabled(true); |
| 916 syncer::SyncData sync_data = | 867 |
| 917 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 868 SyncChangeList list = |
| 918 syncer::SyncChange sync_change(FROM_HERE, | 869 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 919 syncer::SyncChange::ACTION_UPDATE, | 870 |
| 920 sync_data); | |
| 921 syncer::SyncChangeList list(1); | |
| 922 list[0] = sync_change; | |
| 923 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 871 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 924 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); | 872 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); |
| 925 EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); | 873 EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); |
| 926 } | 874 } |
| 927 | 875 |
| 928 { | 876 { |
| 929 ext_specifics->set_enabled(false); | 877 ext_specifics->set_enabled(false); |
| 930 ext_specifics->set_incognito_enabled(true); | 878 ext_specifics->set_incognito_enabled(true); |
| 931 syncer::SyncData sync_data = | 879 |
| 932 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 880 SyncChangeList list = |
| 933 syncer::SyncChange sync_change(FROM_HERE, | 881 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 934 syncer::SyncChange::ACTION_UPDATE, | 882 |
| 935 sync_data); | |
| 936 syncer::SyncChangeList list(1); | |
| 937 list[0] = sync_change; | |
| 938 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 883 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 939 EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); | 884 EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); |
| 940 EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); | 885 EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); |
| 941 } | 886 } |
| 942 | 887 |
| 943 { | 888 { |
| 944 ext_specifics->set_enabled(true); | 889 ext_specifics->set_enabled(true); |
| 945 ext_specifics->set_all_urls_enabled(!kDefaultAllowedScripting); | 890 ext_specifics->set_all_urls_enabled(!kDefaultAllowedScripting); |
| 946 syncer::SyncData sync_data = | 891 |
| 947 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 892 SyncChangeList list = |
| 948 syncer::SyncChange sync_change(FROM_HERE, | 893 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 949 syncer::SyncChange::ACTION_UPDATE, | 894 |
| 950 sync_data); | |
| 951 syncer::SyncChangeList list(1); | |
| 952 list[0] = sync_change; | |
| 953 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 895 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 954 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); | 896 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); |
| 955 EXPECT_TRUE(extensions::util::HasSetAllowedScriptingOnAllUrls( | 897 EXPECT_TRUE(extensions::util::HasSetAllowedScriptingOnAllUrls( |
| 956 good_crx, profile())); | 898 good_crx, profile())); |
| 957 EXPECT_EQ(!kDefaultAllowedScripting, | 899 EXPECT_EQ(!kDefaultAllowedScripting, |
| 958 extensions::util::AllowedScriptingOnAllUrls(good_crx, profile())); | 900 extensions::util::AllowedScriptingOnAllUrls(good_crx, profile())); |
| 959 } | 901 } |
| 960 | 902 |
| 961 { | 903 { |
| 962 ext_specifics->set_all_urls_enabled(kDefaultAllowedScripting); | 904 ext_specifics->set_all_urls_enabled(kDefaultAllowedScripting); |
| 963 syncer::SyncData sync_data = | 905 |
| 964 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 906 SyncChangeList list = |
| 965 syncer::SyncChange sync_change(FROM_HERE, | 907 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 966 syncer::SyncChange::ACTION_UPDATE, | 908 |
| 967 sync_data); | |
| 968 syncer::SyncChangeList list(1); | |
| 969 list[0] = sync_change; | |
| 970 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 909 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 971 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); | 910 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); |
| 972 EXPECT_TRUE(extensions::util::HasSetAllowedScriptingOnAllUrls( | 911 EXPECT_TRUE(extensions::util::HasSetAllowedScriptingOnAllUrls( |
| 973 good_crx, profile())); | 912 good_crx, profile())); |
| 974 EXPECT_EQ(kDefaultAllowedScripting, | 913 EXPECT_EQ(kDefaultAllowedScripting, |
| 975 extensions::util::AllowedScriptingOnAllUrls(good_crx, profile())); | 914 extensions::util::AllowedScriptingOnAllUrls(good_crx, profile())); |
| 976 } | 915 } |
| 977 | 916 |
| 978 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); | 917 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); |
| 979 } | 918 } |
| 980 | 919 |
| 981 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataNewExtension) { | 920 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataNewExtension) { |
| 982 InitializeEmptyExtensionService(); | 921 InitializeEmptyExtensionService(); |
| 983 syncer::FakeSyncChangeProcessor processor; | |
| 984 extension_sync_service()->MergeDataAndStartSyncing( | 922 extension_sync_service()->MergeDataAndStartSyncing( |
| 985 syncer::EXTENSIONS, | 923 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 986 syncer::SyncDataList(), | 924 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 987 scoped_ptr<syncer::SyncChangeProcessor>( | 925 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 988 new syncer::FakeSyncChangeProcessor), | |
| 989 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 990 | 926 |
| 991 const base::FilePath path = data_dir().AppendASCII("good.crx"); | 927 const base::FilePath path = data_dir().AppendASCII("good.crx"); |
| 992 const ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); | 928 const ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); |
| 993 | 929 |
| 994 struct TestCase { | 930 struct TestCase { |
| 995 const char* name; // For failure output only. | 931 const char* name; // For failure output only. |
| 996 bool sync_enabled; // The "enabled" flag coming in from Sync. | 932 bool sync_enabled; // The "enabled" flag coming in from Sync. |
| 997 // The disable reason(s) coming in from Sync, or -1 for "not set". | 933 // The disable reason(s) coming in from Sync, or -1 for "not set". |
| 998 int sync_disable_reasons; | 934 int sync_disable_reasons; |
| 999 // The disable reason(s) that should be set on the installed extension. | 935 // The disable reason(s) that should be set on the installed extension. |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 1026 SCOPED_TRACE(test_case.name); | 962 SCOPED_TRACE(test_case.name); |
| 1027 | 963 |
| 1028 sync_pb::EntitySpecifics specifics; | 964 sync_pb::EntitySpecifics specifics; |
| 1029 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); | 965 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
| 1030 ext_specifics->set_id(good_crx); | 966 ext_specifics->set_id(good_crx); |
| 1031 ext_specifics->set_version(base::Version("1").GetString()); | 967 ext_specifics->set_version(base::Version("1").GetString()); |
| 1032 ext_specifics->set_enabled(test_case.sync_enabled); | 968 ext_specifics->set_enabled(test_case.sync_enabled); |
| 1033 if (test_case.sync_disable_reasons != -1) | 969 if (test_case.sync_disable_reasons != -1) |
| 1034 ext_specifics->set_disable_reasons(test_case.sync_disable_reasons); | 970 ext_specifics->set_disable_reasons(test_case.sync_disable_reasons); |
| 1035 | 971 |
| 1036 syncer::SyncData sync_data = | 972 SyncChangeList list = |
| 1037 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 973 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 1038 syncer::SyncChange sync_change(FROM_HERE, | 974 |
| 1039 syncer::SyncChange::ACTION_UPDATE, | |
| 1040 sync_data); | |
| 1041 syncer::SyncChangeList list(1, sync_change); | |
| 1042 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 975 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 1043 | 976 |
| 1044 ASSERT_TRUE(service()->pending_extension_manager()->IsIdPending(good_crx)); | 977 ASSERT_TRUE(service()->pending_extension_manager()->IsIdPending(good_crx)); |
| 1045 UpdateExtension(good_crx, path, test_case.sync_enabled ? ENABLED | 978 UpdateExtension(good_crx, path, test_case.sync_enabled ? ENABLED |
| 1046 : DISABLED); | 979 : DISABLED); |
| 1047 EXPECT_EQ(test_case.expect_disable_reasons, | 980 EXPECT_EQ(test_case.expect_disable_reasons, |
| 1048 prefs->GetDisableReasons(good_crx)); | 981 prefs->GetDisableReasons(good_crx)); |
| 1049 scoped_ptr<const PermissionSet> permissions = | 982 scoped_ptr<const PermissionSet> permissions = |
| 1050 prefs->GetGrantedPermissions(good_crx); | 983 prefs->GetGrantedPermissions(good_crx); |
| 1051 EXPECT_EQ(test_case.expect_permissions_granted, !permissions->IsEmpty()); | 984 EXPECT_EQ(test_case.expect_permissions_granted, !permissions->IsEmpty()); |
| 1052 ASSERT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); | 985 ASSERT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); |
| 1053 | 986 |
| 1054 // Remove the extension again, so we can install it again for the next case. | 987 // Remove the extension again, so we can install it again for the next case. |
| 1055 UninstallExtension(good_crx, false, | 988 UninstallExtension(good_crx, false, |
| 1056 test_case.sync_enabled ? Extension::ENABLED | 989 test_case.sync_enabled ? Extension::ENABLED |
| 1057 : Extension::DISABLED); | 990 : Extension::DISABLED); |
| 1058 } | 991 } |
| 1059 } | 992 } |
| 1060 | 993 |
| 1061 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataTerminatedExtension) { | 994 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataTerminatedExtension) { |
| 1062 InitializeExtensionServiceWithUpdater(); | 995 InitializeExtensionServiceWithUpdater(); |
| 1063 syncer::FakeSyncChangeProcessor processor; | |
| 1064 extension_sync_service()->MergeDataAndStartSyncing( | 996 extension_sync_service()->MergeDataAndStartSyncing( |
| 1065 syncer::EXTENSIONS, | 997 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 1066 syncer::SyncDataList(), | 998 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 1067 scoped_ptr<syncer::SyncChangeProcessor>( | 999 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 1068 new syncer::FakeSyncChangeProcessor), | |
| 1069 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 1070 | 1000 |
| 1071 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); | 1001 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); |
| 1072 TerminateExtension(good_crx); | 1002 TerminateExtension(good_crx); |
| 1073 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); | 1003 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); |
| 1074 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); | 1004 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); |
| 1075 | 1005 |
| 1076 sync_pb::EntitySpecifics specifics; | 1006 sync_pb::EntitySpecifics specifics; |
| 1077 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); | 1007 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
| 1078 ext_specifics->set_id(good_crx); | 1008 ext_specifics->set_id(good_crx); |
| 1079 ext_specifics->set_version( | 1009 ext_specifics->set_version( |
| 1080 service()->GetInstalledExtension(good_crx)->version()->GetString()); | 1010 service()->GetInstalledExtension(good_crx)->version()->GetString()); |
| 1081 ext_specifics->set_enabled(false); | 1011 ext_specifics->set_enabled(false); |
| 1082 ext_specifics->set_incognito_enabled(true); | 1012 ext_specifics->set_incognito_enabled(true); |
| 1083 syncer::SyncData sync_data = | 1013 |
| 1084 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 1014 SyncChangeList list = |
| 1085 syncer::SyncChange sync_change(FROM_HERE, | 1015 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 1086 syncer::SyncChange::ACTION_UPDATE, | |
| 1087 sync_data); | |
| 1088 syncer::SyncChangeList list(1); | |
| 1089 list[0] = sync_change; | |
| 1090 | 1016 |
| 1091 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 1017 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 1092 EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); | 1018 EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); |
| 1093 EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); | 1019 EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); |
| 1094 | 1020 |
| 1095 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); | 1021 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); |
| 1096 } | 1022 } |
| 1097 | 1023 |
| 1098 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataVersionCheck) { | 1024 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataVersionCheck) { |
| 1099 InitializeExtensionServiceWithUpdater(); | 1025 InitializeExtensionServiceWithUpdater(); |
| 1100 syncer::FakeSyncChangeProcessor processor; | |
| 1101 extension_sync_service()->MergeDataAndStartSyncing( | 1026 extension_sync_service()->MergeDataAndStartSyncing( |
| 1102 syncer::EXTENSIONS, | 1027 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 1103 syncer::SyncDataList(), | 1028 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 1104 scoped_ptr<syncer::SyncChangeProcessor>( | 1029 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 1105 new syncer::FakeSyncChangeProcessor), | |
| 1106 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 1107 | 1030 |
| 1108 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); | 1031 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_NEW); |
| 1109 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); | 1032 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); |
| 1110 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); | 1033 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); |
| 1111 | 1034 |
| 1112 sync_pb::EntitySpecifics specifics; | 1035 sync_pb::EntitySpecifics specifics; |
| 1113 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); | 1036 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
| 1114 ext_specifics->set_id(good_crx); | 1037 ext_specifics->set_id(good_crx); |
| 1115 ext_specifics->set_enabled(true); | 1038 ext_specifics->set_enabled(true); |
| 1116 | 1039 |
| 1117 const base::Version installed_version = | 1040 const base::Version installed_version = |
| 1118 *service()->GetInstalledExtension(good_crx)->version(); | 1041 *service()->GetInstalledExtension(good_crx)->version(); |
| 1119 | 1042 |
| 1120 { | 1043 { |
| 1121 ext_specifics->set_version(installed_version.GetString()); | 1044 ext_specifics->set_version(installed_version.GetString()); |
| 1122 syncer::SyncData sync_data = | 1045 |
| 1123 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 1046 SyncChangeList list = |
| 1124 syncer::SyncChange sync_change(FROM_HERE, | 1047 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 1125 syncer::SyncChange::ACTION_UPDATE, | |
| 1126 sync_data); | |
| 1127 syncer::SyncChangeList list(1, sync_change); | |
| 1128 | 1048 |
| 1129 // Should do nothing if extension version == sync version. | 1049 // Should do nothing if extension version == sync version. |
| 1130 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 1050 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 1131 EXPECT_FALSE(service()->updater()->WillCheckSoon()); | 1051 EXPECT_FALSE(service()->updater()->WillCheckSoon()); |
| 1132 // Make sure the version we'll send back to sync didn't change. | 1052 // Make sure the version we'll send back to sync didn't change. |
| 1133 syncer::SyncDataList data = | 1053 syncer::SyncDataList data = |
| 1134 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); | 1054 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); |
| 1135 ASSERT_EQ(1u, data.size()); | 1055 ASSERT_EQ(1u, data.size()); |
| 1136 scoped_ptr<ExtensionSyncData> extension_data = | 1056 scoped_ptr<ExtensionSyncData> extension_data = |
| 1137 ExtensionSyncData::CreateFromSyncData(data[0]); | 1057 ExtensionSyncData::CreateFromSyncData(data[0]); |
| 1138 ASSERT_TRUE(extension_data); | 1058 ASSERT_TRUE(extension_data); |
| 1139 EXPECT_TRUE(installed_version.Equals(extension_data->version())); | 1059 EXPECT_TRUE(installed_version.Equals(extension_data->version())); |
| 1140 } | 1060 } |
| 1141 | 1061 |
| 1142 // Should do nothing if extension version > sync version. | 1062 // Should do nothing if extension version > sync version. |
| 1143 { | 1063 { |
| 1144 ext_specifics->set_version("0.0.0.0"); | 1064 ext_specifics->set_version("0.0.0.0"); |
| 1145 syncer::SyncData sync_data = | 1065 |
| 1146 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 1066 SyncChangeList list = |
| 1147 syncer::SyncChange sync_change(FROM_HERE, | 1067 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 1148 syncer::SyncChange::ACTION_UPDATE, | |
| 1149 sync_data); | |
| 1150 syncer::SyncChangeList list(1, sync_change); | |
| 1151 | 1068 |
| 1152 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 1069 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 1153 EXPECT_FALSE(service()->updater()->WillCheckSoon()); | 1070 EXPECT_FALSE(service()->updater()->WillCheckSoon()); |
| 1154 // Make sure the version we'll send back to sync didn't change. | 1071 // Make sure the version we'll send back to sync didn't change. |
| 1155 syncer::SyncDataList data = | 1072 syncer::SyncDataList data = |
| 1156 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); | 1073 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); |
| 1157 ASSERT_EQ(1u, data.size()); | 1074 ASSERT_EQ(1u, data.size()); |
| 1158 scoped_ptr<ExtensionSyncData> extension_data = | 1075 scoped_ptr<ExtensionSyncData> extension_data = |
| 1159 ExtensionSyncData::CreateFromSyncData(data[0]); | 1076 ExtensionSyncData::CreateFromSyncData(data[0]); |
| 1160 ASSERT_TRUE(extension_data); | 1077 ASSERT_TRUE(extension_data); |
| 1161 EXPECT_TRUE(installed_version.Equals(extension_data->version())); | 1078 EXPECT_TRUE(installed_version.Equals(extension_data->version())); |
| 1162 } | 1079 } |
| 1163 | 1080 |
| 1164 // Should kick off an update if extension version < sync version. | 1081 // Should kick off an update if extension version < sync version. |
| 1165 { | 1082 { |
| 1166 const base::Version new_version("9.9.9.9"); | 1083 const base::Version new_version("9.9.9.9"); |
| 1167 ext_specifics->set_version(new_version.GetString()); | 1084 ext_specifics->set_version(new_version.GetString()); |
| 1168 syncer::SyncData sync_data = | 1085 |
| 1169 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 1086 SyncChangeList list = |
| 1170 syncer::SyncChange sync_change(FROM_HERE, | 1087 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 1171 syncer::SyncChange::ACTION_UPDATE, | |
| 1172 sync_data); | |
| 1173 syncer::SyncChangeList list(1, sync_change); | |
| 1174 | 1088 |
| 1175 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 1089 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 1176 EXPECT_TRUE(service()->updater()->WillCheckSoon()); | 1090 EXPECT_TRUE(service()->updater()->WillCheckSoon()); |
| 1177 // Make sure that we'll send the NEW version back to sync, even though we | 1091 // Make sure that we'll send the NEW version back to sync, even though we |
| 1178 // haven't actually updated yet. This is to prevent the data in sync from | 1092 // haven't actually updated yet. This is to prevent the data in sync from |
| 1179 // flip-flopping back and forth until all clients are up to date. | 1093 // flip-flopping back and forth until all clients are up to date. |
| 1180 syncer::SyncDataList data = | 1094 syncer::SyncDataList data = |
| 1181 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); | 1095 extension_sync_service()->GetAllSyncData(syncer::EXTENSIONS); |
| 1182 ASSERT_EQ(1u, data.size()); | 1096 ASSERT_EQ(1u, data.size()); |
| 1183 scoped_ptr<ExtensionSyncData> extension_data = | 1097 scoped_ptr<ExtensionSyncData> extension_data = |
| 1184 ExtensionSyncData::CreateFromSyncData(data[0]); | 1098 ExtensionSyncData::CreateFromSyncData(data[0]); |
| 1185 ASSERT_TRUE(extension_data); | 1099 ASSERT_TRUE(extension_data); |
| 1186 EXPECT_TRUE(new_version.Equals(extension_data->version())); | 1100 EXPECT_TRUE(new_version.Equals(extension_data->version())); |
| 1187 } | 1101 } |
| 1188 | 1102 |
| 1189 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); | 1103 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); |
| 1190 } | 1104 } |
| 1191 | 1105 |
| 1192 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataNotInstalled) { | 1106 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataNotInstalled) { |
| 1193 InitializeExtensionServiceWithUpdater(); | 1107 InitializeExtensionServiceWithUpdater(); |
| 1194 syncer::FakeSyncChangeProcessor processor; | |
| 1195 extension_sync_service()->MergeDataAndStartSyncing( | 1108 extension_sync_service()->MergeDataAndStartSyncing( |
| 1196 syncer::EXTENSIONS, | 1109 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 1197 syncer::SyncDataList(), | 1110 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 1198 scoped_ptr<syncer::SyncChangeProcessor>( | 1111 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 1199 new syncer::FakeSyncChangeProcessor), | |
| 1200 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 1201 | 1112 |
| 1202 sync_pb::EntitySpecifics specifics; | 1113 sync_pb::EntitySpecifics specifics; |
| 1203 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); | 1114 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
| 1204 ext_specifics->set_id(good_crx); | 1115 ext_specifics->set_id(good_crx); |
| 1205 ext_specifics->set_enabled(false); | 1116 ext_specifics->set_enabled(false); |
| 1206 ext_specifics->set_incognito_enabled(true); | 1117 ext_specifics->set_incognito_enabled(true); |
| 1207 ext_specifics->set_update_url("http://www.google.com/"); | 1118 ext_specifics->set_update_url("http://www.google.com/"); |
| 1208 ext_specifics->set_version("1.2.3.4"); | 1119 ext_specifics->set_version("1.2.3.4"); |
| 1209 syncer::SyncData sync_data = | 1120 |
| 1210 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 1121 SyncChangeList list = |
| 1211 syncer::SyncChange sync_change(FROM_HERE, | 1122 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 1212 syncer::SyncChange::ACTION_UPDATE, | |
| 1213 sync_data); | |
| 1214 syncer::SyncChangeList list(1); | |
| 1215 list[0] = sync_change; | |
| 1216 | 1123 |
| 1217 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); | 1124 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); |
| 1218 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); | 1125 EXPECT_FALSE(extensions::util::IsIncognitoEnabled(good_crx, profile())); |
| 1219 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 1126 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 1220 EXPECT_TRUE(service()->updater()->WillCheckSoon()); | 1127 EXPECT_TRUE(service()->updater()->WillCheckSoon()); |
| 1221 EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); | 1128 EXPECT_FALSE(service()->IsExtensionEnabled(good_crx)); |
| 1222 EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); | 1129 EXPECT_TRUE(extensions::util::IsIncognitoEnabled(good_crx, profile())); |
| 1223 | 1130 |
| 1224 const extensions::PendingExtensionInfo* info; | 1131 const extensions::PendingExtensionInfo* info; |
| 1225 EXPECT_TRUE( | 1132 EXPECT_TRUE( |
| 1226 (info = service()->pending_extension_manager()->GetById(good_crx))); | 1133 (info = service()->pending_extension_manager()->GetById(good_crx))); |
| 1227 EXPECT_EQ(ext_specifics->update_url(), info->update_url().spec()); | 1134 EXPECT_EQ(ext_specifics->update_url(), info->update_url().spec()); |
| 1228 EXPECT_TRUE(info->is_from_sync()); | 1135 EXPECT_TRUE(info->is_from_sync()); |
| 1229 EXPECT_EQ(Manifest::INTERNAL, info->install_source()); | 1136 EXPECT_EQ(Manifest::INTERNAL, info->install_source()); |
| 1230 // TODO(akalin): Figure out a way to test |info.ShouldAllowInstall()|. | 1137 // TODO(akalin): Figure out a way to test |info.ShouldAllowInstall()|. |
| 1231 } | 1138 } |
| 1232 | 1139 |
| 1233 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataEnableDisable) { | 1140 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataEnableDisable) { |
| 1234 InitializeEmptyExtensionService(); | 1141 InitializeEmptyExtensionService(); |
| 1235 extension_sync_service()->MergeDataAndStartSyncing( | 1142 extension_sync_service()->MergeDataAndStartSyncing( |
| 1236 syncer::EXTENSIONS, | 1143 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 1237 syncer::SyncDataList(), | 1144 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 1238 scoped_ptr<syncer::SyncChangeProcessor>( | 1145 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 1239 new syncer::FakeSyncChangeProcessor), | |
| 1240 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 1241 | 1146 |
| 1242 const ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); | 1147 const ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); |
| 1243 | 1148 |
| 1244 struct TestCase { | 1149 struct TestCase { |
| 1245 const char* name; // For failure output only. | 1150 const char* name; // For failure output only. |
| 1246 // Set of disable reasons before any Sync data comes in. If this is != 0, | 1151 // Set of disable reasons before any Sync data comes in. If this is != 0, |
| 1247 // the extension is disabled. | 1152 // the extension is disabled. |
| 1248 int previous_disable_reasons; | 1153 int previous_disable_reasons; |
| 1249 bool sync_enable; // The enabled flag coming in from Sync. | 1154 bool sync_enable; // The enabled flag coming in from Sync. |
| 1250 // The disable reason(s) coming in from Sync, or -1 for "not set". | 1155 // The disable reason(s) coming in from Sync, or -1 for "not set". |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1311 | 1216 |
| 1312 // Now a sync update comes in. | 1217 // Now a sync update comes in. |
| 1313 sync_pb::EntitySpecifics specifics; | 1218 sync_pb::EntitySpecifics specifics; |
| 1314 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); | 1219 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
| 1315 ext_specifics->set_id(id); | 1220 ext_specifics->set_id(id); |
| 1316 ext_specifics->set_enabled(test_case.sync_enable); | 1221 ext_specifics->set_enabled(test_case.sync_enable); |
| 1317 ext_specifics->set_version(version); | 1222 ext_specifics->set_version(version); |
| 1318 if (test_case.sync_disable_reasons != -1) | 1223 if (test_case.sync_disable_reasons != -1) |
| 1319 ext_specifics->set_disable_reasons(test_case.sync_disable_reasons); | 1224 ext_specifics->set_disable_reasons(test_case.sync_disable_reasons); |
| 1320 | 1225 |
| 1321 syncer::SyncData sync_data = | 1226 SyncChangeList list = |
| 1322 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 1227 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 1323 syncer::SyncChange sync_change(FROM_HERE, | 1228 |
| 1324 syncer::SyncChange::ACTION_UPDATE, | |
| 1325 sync_data); | |
| 1326 syncer::SyncChangeList list(1, sync_change); | |
| 1327 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 1229 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 1328 | 1230 |
| 1329 // Check expectations. | 1231 // Check expectations. |
| 1330 const bool expect_enabled = !test_case.expect_disable_reasons; | 1232 const bool expect_enabled = !test_case.expect_disable_reasons; |
| 1331 EXPECT_EQ(expect_enabled, service()->IsExtensionEnabled(id)); | 1233 EXPECT_EQ(expect_enabled, service()->IsExtensionEnabled(id)); |
| 1332 EXPECT_EQ(test_case.expect_disable_reasons, prefs->GetDisableReasons(id)); | 1234 EXPECT_EQ(test_case.expect_disable_reasons, prefs->GetDisableReasons(id)); |
| 1333 | 1235 |
| 1334 // Remove the extension again, so we can install it again for the next case. | 1236 // Remove the extension again, so we can install it again for the next case. |
| 1335 UninstallExtension(id, false, expect_enabled ? Extension::ENABLED | 1237 UninstallExtension(id, false, expect_enabled ? Extension::ENABLED |
| 1336 : Extension::DISABLED); | 1238 : Extension::DISABLED); |
| 1337 } | 1239 } |
| 1338 } | 1240 } |
| 1339 | 1241 |
| 1340 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataDeferredEnable) { | 1242 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataDeferredEnable) { |
| 1341 InitializeEmptyExtensionService(); | 1243 InitializeEmptyExtensionService(); |
| 1342 extension_sync_service()->MergeDataAndStartSyncing( | 1244 extension_sync_service()->MergeDataAndStartSyncing( |
| 1343 syncer::EXTENSIONS, | 1245 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 1344 syncer::SyncDataList(), | 1246 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 1345 scoped_ptr<syncer::SyncChangeProcessor>( | 1247 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 1346 new syncer::FakeSyncChangeProcessor), | |
| 1347 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 1348 | 1248 |
| 1349 base::FilePath base_path = data_dir().AppendASCII("permissions_increase"); | 1249 base::FilePath base_path = data_dir().AppendASCII("permissions_increase"); |
| 1350 base::FilePath pem_path = base_path.AppendASCII("permissions.pem"); | 1250 base::FilePath pem_path = base_path.AppendASCII("permissions.pem"); |
| 1351 | 1251 |
| 1352 base::FilePath path = base_path.AppendASCII("v1"); | 1252 base::FilePath path = base_path.AppendASCII("v1"); |
| 1353 const Extension* extension = PackAndInstallCRX(path, pem_path, INSTALL_NEW); | 1253 const Extension* extension = PackAndInstallCRX(path, pem_path, INSTALL_NEW); |
| 1354 // The extension must now be installed and enabled. | 1254 // The extension must now be installed and enabled. |
| 1355 ASSERT_TRUE(extension); | 1255 ASSERT_TRUE(extension); |
| 1356 ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id())); | 1256 ASSERT_TRUE(registry()->enabled_extensions().Contains(extension->id())); |
| 1357 | 1257 |
| 1358 // Save the id, as the extension object will be destroyed during updating. | 1258 // Save the id, as the extension object will be destroyed during updating. |
| 1359 std::string id = extension->id(); | 1259 std::string id = extension->id(); |
| 1360 | 1260 |
| 1361 // Update to a new version with increased permissions. | 1261 // Update to a new version with increased permissions. |
| 1362 path = base_path.AppendASCII("v2"); | 1262 path = base_path.AppendASCII("v2"); |
| 1363 PackCRXAndUpdateExtension(id, path, pem_path, DISABLED); | 1263 PackCRXAndUpdateExtension(id, path, pem_path, DISABLED); |
| 1364 | 1264 |
| 1365 // Now a sync update comes in, telling us to re-enable a *newer* version. | 1265 // Now a sync update comes in, telling us to re-enable a *newer* version. |
| 1366 sync_pb::EntitySpecifics specifics; | 1266 sync_pb::EntitySpecifics specifics; |
| 1367 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); | 1267 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
| 1368 ext_specifics->set_id(id); | 1268 ext_specifics->set_id(id); |
| 1369 ext_specifics->set_version("3"); | 1269 ext_specifics->set_version("3"); |
| 1370 ext_specifics->set_enabled(true); | 1270 ext_specifics->set_enabled(true); |
| 1371 ext_specifics->set_disable_reasons(Extension::DISABLE_NONE); | 1271 ext_specifics->set_disable_reasons(Extension::DISABLE_NONE); |
| 1372 | 1272 |
| 1373 syncer::SyncData sync_data = | 1273 SyncChangeList list = |
| 1374 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 1274 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 1375 syncer::SyncChange sync_change(FROM_HERE, | 1275 |
| 1376 syncer::SyncChange::ACTION_UPDATE, | |
| 1377 sync_data); | |
| 1378 syncer::SyncChangeList list(1, sync_change); | |
| 1379 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 1276 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 1380 | 1277 |
| 1381 // Since the version didn't match, the extension should still be disabled. | 1278 // Since the version didn't match, the extension should still be disabled. |
| 1382 EXPECT_TRUE(registry()->disabled_extensions().Contains(id)); | 1279 EXPECT_TRUE(registry()->disabled_extensions().Contains(id)); |
| 1383 | 1280 |
| 1384 // After we update to the matching version, the extension should get enabled. | 1281 // After we update to the matching version, the extension should get enabled. |
| 1385 path = base_path.AppendASCII("v3"); | 1282 path = base_path.AppendASCII("v3"); |
| 1386 PackCRXAndUpdateExtension(id, path, pem_path, ENABLED); | 1283 PackCRXAndUpdateExtension(id, path, pem_path, ENABLED); |
| 1387 } | 1284 } |
| 1388 | 1285 |
| 1389 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataPermissionApproval) { | 1286 TEST_F(ExtensionServiceSyncTest, ProcessSyncDataPermissionApproval) { |
| 1390 // This is the update URL specified in the test extension. Setting it here is | 1287 // This is the update URL specified in the test extension. Setting it here is |
| 1391 // necessary to make it considered syncable. | 1288 // necessary to make it considered syncable. |
| 1392 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 1289 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 1393 switches::kAppsGalleryUpdateURL, | 1290 switches::kAppsGalleryUpdateURL, |
| 1394 "http://localhost/autoupdate/updates.xml"); | 1291 "http://localhost/autoupdate/updates.xml"); |
| 1395 | 1292 |
| 1396 InitializeEmptyExtensionService(); | 1293 InitializeEmptyExtensionService(); |
| 1397 extension_sync_service()->MergeDataAndStartSyncing( | 1294 extension_sync_service()->MergeDataAndStartSyncing( |
| 1398 syncer::EXTENSIONS, | 1295 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 1399 syncer::SyncDataList(), | 1296 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 1400 scoped_ptr<syncer::SyncChangeProcessor>( | 1297 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 1401 new syncer::FakeSyncChangeProcessor), | |
| 1402 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 1403 | 1298 |
| 1404 const base::FilePath base_path = | 1299 const base::FilePath base_path = |
| 1405 data_dir().AppendASCII("permissions_increase"); | 1300 data_dir().AppendASCII("permissions_increase"); |
| 1406 const base::FilePath pem_path = base_path.AppendASCII("permissions.pem"); | 1301 const base::FilePath pem_path = base_path.AppendASCII("permissions.pem"); |
| 1407 const base::FilePath path_v1 = base_path.AppendASCII("v1"); | 1302 const base::FilePath path_v1 = base_path.AppendASCII("v1"); |
| 1408 const base::FilePath path_v2 = base_path.AppendASCII("v2"); | 1303 const base::FilePath path_v2 = base_path.AppendASCII("v2"); |
| 1409 | 1304 |
| 1410 base::ScopedTempDir crx_dir; | 1305 base::ScopedTempDir crx_dir; |
| 1411 ASSERT_TRUE(crx_dir.CreateUniqueTempDir()); | 1306 ASSERT_TRUE(crx_dir.CreateUniqueTempDir()); |
| 1412 const base::FilePath crx_path_v1 = crx_dir.path().AppendASCII("temp1.crx"); | 1307 const base::FilePath crx_path_v1 = crx_dir.path().AppendASCII("temp1.crx"); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1480 | 1375 |
| 1481 // Now a sync update comes in. | 1376 // Now a sync update comes in. |
| 1482 sync_pb::EntitySpecifics specifics; | 1377 sync_pb::EntitySpecifics specifics; |
| 1483 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); | 1378 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
| 1484 ext_specifics->set_id(id); | 1379 ext_specifics->set_id(id); |
| 1485 ext_specifics->set_enabled(true); | 1380 ext_specifics->set_enabled(true); |
| 1486 ext_specifics->set_version(test_case.sync_version); | 1381 ext_specifics->set_version(test_case.sync_version); |
| 1487 if (test_case.sync_disable_reasons != -1) | 1382 if (test_case.sync_disable_reasons != -1) |
| 1488 ext_specifics->set_disable_reasons(test_case.sync_disable_reasons); | 1383 ext_specifics->set_disable_reasons(test_case.sync_disable_reasons); |
| 1489 | 1384 |
| 1490 syncer::SyncData sync_data = | 1385 SyncChangeList list = |
| 1491 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); | 1386 MakeSyncChangeList(good_crx, specifics, SyncChange::ACTION_UPDATE); |
| 1492 syncer::SyncChange sync_change(FROM_HERE, | 1387 |
| 1493 syncer::SyncChange::ACTION_UPDATE, | |
| 1494 sync_data); | |
| 1495 syncer::SyncChangeList list(1, sync_change); | |
| 1496 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | 1388 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 1497 | 1389 |
| 1498 // Check expectations. | 1390 // Check expectations. |
| 1499 const bool expect_enabled = !test_case.expect_disable_reasons; | 1391 const bool expect_enabled = !test_case.expect_disable_reasons; |
| 1500 EXPECT_EQ(expect_enabled, service()->IsExtensionEnabled(id)); | 1392 EXPECT_EQ(expect_enabled, service()->IsExtensionEnabled(id)); |
| 1501 EXPECT_EQ(test_case.expect_disable_reasons, prefs->GetDisableReasons(id)); | 1393 EXPECT_EQ(test_case.expect_disable_reasons, prefs->GetDisableReasons(id)); |
| 1502 scoped_ptr<const PermissionSet> granted_permissions = | 1394 scoped_ptr<const PermissionSet> granted_permissions = |
| 1503 prefs->GetGrantedPermissions(id); | 1395 prefs->GetGrantedPermissions(id); |
| 1504 if (test_case.expect_permissions_granted) { | 1396 if (test_case.expect_permissions_granted) { |
| 1505 scoped_ptr<const PermissionSet> active_permissions = | 1397 scoped_ptr<const PermissionSet> active_permissions = |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1733 ext_specifics->set_enabled(true); | 1625 ext_specifics->set_enabled(true); |
| 1734 ext_specifics->set_disable_reasons(Extension::DISABLE_NONE); | 1626 ext_specifics->set_disable_reasons(Extension::DISABLE_NONE); |
| 1735 ext_specifics->set_installed_by_custodian(true); | 1627 ext_specifics->set_installed_by_custodian(true); |
| 1736 ext_specifics->set_version(version1); | 1628 ext_specifics->set_version(version1); |
| 1737 | 1629 |
| 1738 // Attempting to re-enable an old version should result in a permission | 1630 // Attempting to re-enable an old version should result in a permission |
| 1739 // request for the current version. | 1631 // request for the current version. |
| 1740 EXPECT_CALL(*creator, CreateExtensionUpdateRequest( | 1632 EXPECT_CALL(*creator, CreateExtensionUpdateRequest( |
| 1741 UpdateRequestId(id, version2), testing::_)); | 1633 UpdateRequestId(id, version2), testing::_)); |
| 1742 | 1634 |
| 1743 syncer::SyncData sync_data = | 1635 SyncChangeList list = |
| 1744 syncer::SyncData::CreateLocalData(id, "Name", specifics); | 1636 MakeSyncChangeList(id, specifics, SyncChange::ACTION_UPDATE); |
| 1745 syncer::SyncChange sync_change(FROM_HERE, syncer::SyncChange::ACTION_UPDATE, | 1637 |
| 1746 sync_data); | 1638 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 1747 syncer::SyncChangeList change_list(1, sync_change); | |
| 1748 extension_sync_service()->ProcessSyncChanges(FROM_HERE, change_list); | |
| 1749 // The re-enable should be ignored, since the version doesn't match. | 1639 // The re-enable should be ignored, since the version doesn't match. |
| 1750 EXPECT_FALSE(registry()->enabled_extensions().Contains(id)); | 1640 EXPECT_FALSE(registry()->enabled_extensions().Contains(id)); |
| 1751 EXPECT_FALSE(extension_sync_service()->HasPendingReenable( | 1641 EXPECT_FALSE(extension_sync_service()->HasPendingReenable( |
| 1752 id, base::Version(version1))); | 1642 id, base::Version(version1))); |
| 1753 EXPECT_FALSE(extension_sync_service()->HasPendingReenable( | 1643 EXPECT_FALSE(extension_sync_service()->HasPendingReenable( |
| 1754 id, base::Version(version2))); | 1644 id, base::Version(version2))); |
| 1755 } | 1645 } |
| 1756 | 1646 |
| 1757 TEST_F(ExtensionServiceTestSupervised, | 1647 TEST_F(ExtensionServiceTestSupervised, |
| 1758 UpdateWithPermissionIncreaseApprovalMatchingVersion) { | 1648 UpdateWithPermissionIncreaseApprovalMatchingVersion) { |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1778 // Simulate a custodian approval for re-enabling the extension coming in | 1668 // Simulate a custodian approval for re-enabling the extension coming in |
| 1779 // through Sync. | 1669 // through Sync. |
| 1780 sync_pb::EntitySpecifics specifics; | 1670 sync_pb::EntitySpecifics specifics; |
| 1781 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); | 1671 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
| 1782 ext_specifics->set_id(id); | 1672 ext_specifics->set_id(id); |
| 1783 ext_specifics->set_enabled(true); | 1673 ext_specifics->set_enabled(true); |
| 1784 ext_specifics->set_disable_reasons(Extension::DISABLE_NONE); | 1674 ext_specifics->set_disable_reasons(Extension::DISABLE_NONE); |
| 1785 ext_specifics->set_installed_by_custodian(true); | 1675 ext_specifics->set_installed_by_custodian(true); |
| 1786 ext_specifics->set_version(version2); | 1676 ext_specifics->set_version(version2); |
| 1787 | 1677 |
| 1788 syncer::SyncData sync_data = | 1678 SyncChangeList list = |
| 1789 syncer::SyncData::CreateLocalData(id, "Name", specifics); | 1679 MakeSyncChangeList(id, specifics, SyncChange::ACTION_UPDATE); |
| 1790 syncer::SyncChange sync_change(FROM_HERE, syncer::SyncChange::ACTION_UPDATE, | 1680 |
| 1791 sync_data); | 1681 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 1792 syncer::SyncChangeList change_list(1, sync_change); | |
| 1793 extension_sync_service()->ProcessSyncChanges(FROM_HERE, change_list); | |
| 1794 // The extension should have gotten re-enabled. | 1682 // The extension should have gotten re-enabled. |
| 1795 EXPECT_TRUE(registry()->enabled_extensions().Contains(id)); | 1683 EXPECT_TRUE(registry()->enabled_extensions().Contains(id)); |
| 1796 } | 1684 } |
| 1797 | 1685 |
| 1798 TEST_F(ExtensionServiceTestSupervised, | 1686 TEST_F(ExtensionServiceTestSupervised, |
| 1799 UpdateWithPermissionIncreaseApprovalNewVersion) { | 1687 UpdateWithPermissionIncreaseApprovalNewVersion) { |
| 1800 // Explicitly enable the "need custodian approval" field trial. | 1688 // Explicitly enable the "need custodian approval" field trial. |
| 1801 base::FieldTrialList field_trial_list(new base::MockEntropyProvider()); | 1689 base::FieldTrialList field_trial_list(new base::MockEntropyProvider()); |
| 1802 base::FieldTrialList::CreateFieldTrial( | 1690 base::FieldTrialList::CreateFieldTrial( |
| 1803 "SupervisedUserExtensionPermissionIncrease", "NeedCustodianApproval"); | 1691 "SupervisedUserExtensionPermissionIncrease", "NeedCustodianApproval"); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 1825 ext_specifics->set_enabled(true); | 1713 ext_specifics->set_enabled(true); |
| 1826 ext_specifics->set_disable_reasons(Extension::DISABLE_NONE); | 1714 ext_specifics->set_disable_reasons(Extension::DISABLE_NONE); |
| 1827 ext_specifics->set_installed_by_custodian(true); | 1715 ext_specifics->set_installed_by_custodian(true); |
| 1828 ext_specifics->set_version(version3); | 1716 ext_specifics->set_version(version3); |
| 1829 | 1717 |
| 1830 // This should *not* result in a new permission request. | 1718 // This should *not* result in a new permission request. |
| 1831 EXPECT_CALL(*creator, CreateExtensionUpdateRequest( | 1719 EXPECT_CALL(*creator, CreateExtensionUpdateRequest( |
| 1832 UpdateRequestId(id, version3), testing::_)) | 1720 UpdateRequestId(id, version3), testing::_)) |
| 1833 .Times(0); | 1721 .Times(0); |
| 1834 | 1722 |
| 1835 syncer::SyncData sync_data = | 1723 SyncChangeList list = |
| 1836 syncer::SyncData::CreateLocalData(id, "Name", specifics); | 1724 MakeSyncChangeList(id, specifics, SyncChange::ACTION_UPDATE); |
| 1837 syncer::SyncChange sync_change(FROM_HERE, syncer::SyncChange::ACTION_UPDATE, | 1725 |
| 1838 sync_data); | 1726 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 1839 syncer::SyncChangeList change_list(1, sync_change); | |
| 1840 extension_sync_service()->ProcessSyncChanges(FROM_HERE, change_list); | |
| 1841 // The re-enable should be delayed until the extension is updated to the | 1727 // The re-enable should be delayed until the extension is updated to the |
| 1842 // matching version. | 1728 // matching version. |
| 1843 EXPECT_FALSE(registry()->enabled_extensions().Contains(id)); | 1729 EXPECT_FALSE(registry()->enabled_extensions().Contains(id)); |
| 1844 EXPECT_TRUE(extension_sync_service()->HasPendingReenable( | 1730 EXPECT_TRUE(extension_sync_service()->HasPendingReenable( |
| 1845 id, base::Version(version3))); | 1731 id, base::Version(version3))); |
| 1846 | 1732 |
| 1847 // Update to the matching version. Now the extension should get enabled. | 1733 // Update to the matching version. Now the extension should get enabled. |
| 1848 UpdatePermissionsTestExtension(id, version3, ENABLED); | 1734 UpdatePermissionsTestExtension(id, version3, ENABLED); |
| 1849 } | 1735 } |
| 1850 | 1736 |
| 1851 TEST_F(ExtensionServiceSyncTest, SyncUninstallByCustodianSkipsPolicy) { | 1737 TEST_F(ExtensionServiceSyncTest, SyncUninstallByCustodianSkipsPolicy) { |
| 1852 InitializeEmptyExtensionService(); | 1738 InitializeEmptyExtensionService(); |
| 1853 extension_sync_service()->MergeDataAndStartSyncing( | 1739 extension_sync_service()->MergeDataAndStartSyncing( |
| 1854 syncer::EXTENSIONS, | 1740 syncer::EXTENSIONS, syncer::SyncDataList(), |
| 1855 syncer::SyncDataList(), | 1741 make_scoped_ptr(new syncer::FakeSyncChangeProcessor), |
| 1856 scoped_ptr<syncer::SyncChangeProcessor>( | 1742 make_scoped_ptr(new syncer::SyncErrorFactoryMock)); |
| 1857 new syncer::FakeSyncChangeProcessor), | |
| 1858 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | |
| 1859 | 1743 |
| 1860 // Install two extensions. | 1744 // Install two extensions. |
| 1861 base::FilePath path1 = data_dir().AppendASCII("good.crx"); | 1745 base::FilePath path1 = data_dir().AppendASCII("good.crx"); |
| 1862 base::FilePath path2 = data_dir().AppendASCII("good2048.crx"); | 1746 base::FilePath path2 = data_dir().AppendASCII("good2048.crx"); |
| 1863 const Extension* extensions[] = { | 1747 const Extension* extensions[] = { |
| 1864 InstallCRX(path1, INSTALL_NEW), | 1748 InstallCRX(path1, INSTALL_NEW), |
| 1865 InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN) | 1749 InstallCRX(path2, INSTALL_NEW, Extension::WAS_INSTALLED_BY_CUSTODIAN) |
| 1866 }; | 1750 }; |
| 1867 | 1751 |
| 1868 // Add a policy provider that will disallow any changes. | 1752 // Add a policy provider that will disallow any changes. |
| 1869 extensions::TestManagementPolicyProvider provider( | 1753 extensions::TestManagementPolicyProvider provider( |
| 1870 extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); | 1754 extensions::TestManagementPolicyProvider::PROHIBIT_MODIFY_STATUS); |
| 1871 ExtensionSystem::Get( | 1755 ExtensionSystem::Get( |
| 1872 browser_context())->management_policy()->RegisterProvider(&provider); | 1756 browser_context())->management_policy()->RegisterProvider(&provider); |
| 1873 | 1757 |
| 1874 // Create a sync deletion for each extension. | 1758 // Create a sync deletion for each extension. |
| 1875 syncer::SyncChangeList change_list; | 1759 SyncChangeList list; |
| 1876 for (size_t i = 0; i < arraysize(extensions); i++) { | 1760 for (size_t i = 0; i < arraysize(extensions); i++) { |
| 1877 const std::string& id = extensions[i]->id(); | 1761 const std::string& id = extensions[i]->id(); |
| 1878 sync_pb::EntitySpecifics specifics; | 1762 sync_pb::EntitySpecifics specifics; |
| 1879 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); | 1763 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
| 1880 ext_specifics->set_id(id); | 1764 ext_specifics->set_id(id); |
| 1881 ext_specifics->set_version("1.0"); | 1765 ext_specifics->set_version("1.0"); |
| 1882 ext_specifics->set_installed_by_custodian( | 1766 ext_specifics->set_installed_by_custodian( |
| 1883 extensions[i]->was_installed_by_custodian()); | 1767 extensions[i]->was_installed_by_custodian()); |
| 1884 syncer::SyncData sync_data = | 1768 syncer::SyncData sync_data = |
| 1885 syncer::SyncData::CreateLocalData(id, "Name", specifics); | 1769 syncer::SyncData::CreateLocalData(id, "Name", specifics); |
| 1886 change_list.push_back(syncer::SyncChange(FROM_HERE, | 1770 list.push_back(SyncChange(FROM_HERE, SyncChange::ACTION_DELETE, sync_data)); |
| 1887 syncer::SyncChange::ACTION_DELETE, | |
| 1888 sync_data)); | |
| 1889 } | 1771 } |
| 1890 | 1772 |
| 1891 // Save the extension ids, as uninstalling destroys the Extension instance. | 1773 // Save the extension ids, as uninstalling destroys the Extension instance. |
| 1892 std::string extension_ids[] = { | 1774 std::string extension_ids[] = { |
| 1893 extensions[0]->id(), | 1775 extensions[0]->id(), |
| 1894 extensions[1]->id() | 1776 extensions[1]->id() |
| 1895 }; | 1777 }; |
| 1896 | 1778 |
| 1897 // Now apply the uninstallations. | 1779 // Now apply the uninstallations. |
| 1898 extension_sync_service()->ProcessSyncChanges(FROM_HERE, change_list); | 1780 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 1899 | 1781 |
| 1900 // Uninstalling the extension without installed_by_custodian should have been | 1782 // Uninstalling the extension without installed_by_custodian should have been |
| 1901 // blocked by policy, so it should still be there. | 1783 // blocked by policy, so it should still be there. |
| 1902 EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_ids[0])); | 1784 EXPECT_TRUE(registry()->enabled_extensions().Contains(extension_ids[0])); |
| 1903 | 1785 |
| 1904 // But installed_by_custodian should result in bypassing the policy check. | 1786 // But installed_by_custodian should result in bypassing the policy check. |
| 1905 EXPECT_FALSE( | 1787 EXPECT_FALSE( |
| 1906 registry()->GenerateInstalledExtensionsSet()->Contains(extension_ids[1])); | 1788 registry()->GenerateInstalledExtensionsSet()->Contains(extension_ids[1])); |
| 1907 } | 1789 } |
| 1908 | 1790 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 1924 .SetID(crx_file::id_util::GenerateId(kName)) | 1806 .SetID(crx_file::id_util::GenerateId(kName)) |
| 1925 .Build(); | 1807 .Build(); |
| 1926 | 1808 |
| 1927 // Install and enable it. | 1809 // Install and enable it. |
| 1928 service()->AddExtension(extension.get()); | 1810 service()->AddExtension(extension.get()); |
| 1929 service()->GrantPermissionsAndEnableExtension(extension.get()); | 1811 service()->GrantPermissionsAndEnableExtension(extension.get()); |
| 1930 const std::string id = extension->id(); | 1812 const std::string id = extension->id(); |
| 1931 EXPECT_TRUE(registry()->enabled_extensions().GetByID(id)); | 1813 EXPECT_TRUE(registry()->enabled_extensions().GetByID(id)); |
| 1932 | 1814 |
| 1933 // Simulate a sync node coming in where the extension had all-hosts withheld. | 1815 // Simulate a sync node coming in where the extension had all-hosts withheld. |
| 1934 // This means that it should have all-hosts withheld on this machine, too. | 1816 // This means that it should have all-hosts withheld on this machine, |
|
Devlin
2015/12/02 17:24:50
?
Marc Treib
2015/12/03 09:29:41
Err... no idea how that happened?! Reverted, thank
| |
| 1935 syncer::SyncChangeList change_list; | |
| 1936 sync_pb::EntitySpecifics specifics; | 1817 sync_pb::EntitySpecifics specifics; |
| 1937 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); | 1818 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
| 1938 ext_specifics->set_id(id); | 1819 ext_specifics->set_id(id); |
| 1939 ext_specifics->set_name(kName); | 1820 ext_specifics->set_name(kName); |
| 1940 ext_specifics->set_version("1.0"); | 1821 ext_specifics->set_version("1.0"); |
| 1941 ext_specifics->set_all_urls_enabled(false); | 1822 ext_specifics->set_all_urls_enabled(false); |
| 1942 ext_specifics->set_enabled(true); | 1823 ext_specifics->set_enabled(true); |
| 1943 syncer::SyncData sync_data = | |
| 1944 syncer::SyncData::CreateLocalData(id, "Name", specifics); | |
| 1945 change_list.push_back(syncer::SyncChange(FROM_HERE, | |
| 1946 syncer::SyncChange::ACTION_UPDATE, | |
| 1947 sync_data)); | |
| 1948 | 1824 |
| 1949 extension_sync_service()->ProcessSyncChanges(FROM_HERE, change_list); | 1825 SyncChangeList list = |
| 1826 MakeSyncChangeList(id, specifics, SyncChange::ACTION_UPDATE); | |
| 1827 | |
| 1828 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); | |
| 1950 | 1829 |
| 1951 EXPECT_TRUE(registry()->enabled_extensions().GetByID(id)); | 1830 EXPECT_TRUE(registry()->enabled_extensions().GetByID(id)); |
| 1952 EXPECT_FALSE(extensions::util::AllowedScriptingOnAllUrls(id, profile())); | 1831 EXPECT_FALSE(extensions::util::AllowedScriptingOnAllUrls(id, profile())); |
| 1953 EXPECT_TRUE(extensions::util::HasSetAllowedScriptingOnAllUrls(id, profile())); | 1832 EXPECT_TRUE(extensions::util::HasSetAllowedScriptingOnAllUrls(id, profile())); |
| 1954 EXPECT_FALSE(extensions::util::AllowedScriptingOnAllUrls(id, profile())); | 1833 EXPECT_FALSE(extensions::util::AllowedScriptingOnAllUrls(id, profile())); |
| 1955 } | 1834 } |
| 1956 | 1835 |
| 1957 #endif // defined(ENABLE_SUPERVISED_USERS) | 1836 #endif // defined(ENABLE_SUPERVISED_USERS) |
| OLD | NEW |