Index: sync/engine/conflict_resolver.cc |
diff --git a/sync/engine/conflict_resolver.cc b/sync/engine/conflict_resolver.cc |
index 0af30977c331e8840fe7ef27a77362114de875af..f1f15914152f2d631122324a50d0f34f1d1eb941 100644 |
--- a/sync/engine/conflict_resolver.cc |
+++ b/sync/engine/conflict_resolver.cc |
@@ -115,8 +115,11 @@ void ConflictResolver::ProcessSimpleConflict(WriteTransaction* trans, |
// safely ignore the server changes as redundant. |
// f) Otherwise, it's in general safer to ignore local changes, with the |
// exception of deletion conflicts (choose to undelete) and conflicts |
- // where the non_unique_name or parent don't match. |
- if (!entry.GetServerIsDel()) { |
+ // where the non_unique_name or parent don't match. Another exception is |
Nicolas Zea
2016/02/11 23:41:50
nit: may as well put this into its own e) bullet
asargent_no_longer_on_chrome
2016/02/18 00:53:45
Done.
|
+ // the case of extensions and apps, where we want uninstalls to win over |
+ // local modifications to avoid "back from the dead" reinstalls. |
+ ModelType type = entry.GetModelType(); |
+ if (!entry.GetServerIsDel() || (type == EXTENSIONS || type == APPS)) { |
// TODO(nick): The current logic is arbitrary; instead, it ought to be made |
// consistent with the ModelAssociator behavior for a datatype. It would |
// be nice if we could route this back to ModelAssociator code to pick one |