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

Issue 27233003: [Sync] Implementation of model association for passwords using sync API (Closed)

Created:
7 years, 2 months ago by lipalani1
Modified:
6 years, 9 months ago
CC:
chromium-reviews
Visibility:
Public.

Description

Implementation of the |MergeDataAndStartSyncing| along with unit tests. BUG=95758

Patch Set 1 #

Patch Set 2 : For review #

Patch Set 3 : For review. #

Total comments: 15

Patch Set 4 : For review.\ #

Total comments: 22

Patch Set 5 : For review. #

Patch Set 6 : #

Patch Set 7 : For review. #

Total comments: 16

Patch Set 8 : For review. #

Patch Set 9 : For review. #

Total comments: 17

Patch Set 10 : For review. #

Patch Set 11 : For review. #

Total comments: 2

Patch Set 12 : For review. #

Total comments: 2

Patch Set 13 : #

Total comments: 90

Patch Set 14 : For review. #

Patch Set 15 : For review #

Total comments: 97

Patch Set 16 : For review. #

Total comments: 27
Unified diffs Side-by-side diffs Delta from patch set Stats (+640 lines, -16 lines) Patch
M chrome/browser/password_manager/password_syncable_service.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2 chunks +46 lines, -5 lines 6 comments Download
M chrome/browser/password_manager/password_syncable_service.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 5 chunks +187 lines, -11 lines 10 comments Download
A chrome/browser/password_manager/password_syncable_service_unittest.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 chunk +396 lines, -0 lines 10 comments Download
M chrome/chrome_tests_unit.gypi View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 chunk +1 line, -0 lines 0 comments Download
M sync/api/sync_error.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 chunk +3 lines, -0 lines 1 comment Download
M sync/api/sync_error.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 chunks +7 lines, -0 lines 0 comments Download

Messages

Total messages: 25 (0 generated)
lipalani1
Please take a look.
7 years, 2 months ago (2013-10-14 23:18:07 UTC) #1
Nicolas Zea
https://codereview.chromium.org/27233003/diff/6001/chrome/browser/password_manager/password_syncable_service.cc File chrome/browser/password_manager/password_syncable_service.cc (right): https://codereview.chromium.org/27233003/diff/6001/chrome/browser/password_manager/password_syncable_service.cc#newcode72 chrome/browser/password_manager/password_syncable_service.cc:72: std::vector<autofill::PasswordForm*>* new_entries, pass ScopedVectors instead? https://codereview.chromium.org/27233003/diff/6001/chrome/browser/password_manager/password_syncable_service.cc#newcode73 chrome/browser/password_manager/password_syncable_service.cc:73: std::vector<autofill::PasswordForm*>* udpated_entries) ...
7 years, 2 months ago (2013-10-15 22:04:10 UTC) #2
lipalani1
PTAL https://codereview.chromium.org/27233003/diff/6001/chrome/browser/password_manager/password_syncable_service.cc File chrome/browser/password_manager/password_syncable_service.cc (right): https://codereview.chromium.org/27233003/diff/6001/chrome/browser/password_manager/password_syncable_service.cc#newcode72 chrome/browser/password_manager/password_syncable_service.cc:72: std::vector<autofill::PasswordForm*>* new_entries, On 2013/10/15 22:04:10, Nicolas Zea wrote: ...
7 years, 2 months ago (2013-10-18 23:33:03 UTC) #3
lipalani1
Ping! Thanks!
7 years, 2 months ago (2013-10-21 20:25:06 UTC) #4
Nicolas Zea
https://codereview.chromium.org/27233003/diff/6001/chrome/browser/password_manager/password_syncable_service.cc File chrome/browser/password_manager/password_syncable_service.cc (right): https://codereview.chromium.org/27233003/diff/6001/chrome/browser/password_manager/password_syncable_service.cc#newcode140 chrome/browser/password_manager/password_syncable_service.cc:140: PasswordEntryMap new_db_entries; On 2013/10/18 23:33:03, lipalani1 wrote: > Possible ...
7 years, 2 months ago (2013-10-21 23:55:14 UTC) #5
lipalani1
PTAL. https://codereview.chromium.org/27233003/diff/13001/chrome/browser/password_manager/password_syncable_service.cc File chrome/browser/password_manager/password_syncable_service.cc (right): https://codereview.chromium.org/27233003/diff/13001/chrome/browser/password_manager/password_syncable_service.cc#newcode8 chrome/browser/password_manager/password_syncable_service.cc:8: #include "base/memory/scoped_ptr.h" On 2013/10/21 23:55:14, Nicolas Zea wrote: ...
7 years, 2 months ago (2013-10-24 00:13:57 UTC) #6
Nicolas Zea
https://codereview.chromium.org/27233003/diff/143001/chrome/browser/password_manager/password_syncable_service.cc File chrome/browser/password_manager/password_syncable_service.cc (right): https://codereview.chromium.org/27233003/diff/143001/chrome/browser/password_manager/password_syncable_service.cc#newcode148 chrome/browser/password_manager/password_syncable_service.cc:148: ScopedVector<autofill::PasswordForm> new_synced_entries; nit: I think the name here would ...
7 years, 1 month ago (2013-10-25 20:20:12 UTC) #7
lipalani1
Fixed the feedback and made comments for the couple that I did not fix. PTAL. ...
7 years, 1 month ago (2013-10-29 20:16:36 UTC) #8
lipalani1
On 2013/10/29 20:16:36, lipalani1 wrote: > Fixed the feedback and made comments for the couple ...
7 years, 1 month ago (2013-10-30 21:09:12 UTC) #9
Nicolas Zea
https://codereview.chromium.org/27233003/diff/263001/chrome/browser/password_manager/password_syncable_service_unittest.cc File chrome/browser/password_manager/password_syncable_service_unittest.cc (right): https://codereview.chromium.org/27233003/diff/263001/chrome/browser/password_manager/password_syncable_service_unittest.cc#newcode35 chrome/browser/password_manager/password_syncable_service_unittest.cc:35: namespace { nit: newline after https://codereview.chromium.org/27233003/diff/263001/chrome/browser/password_manager/password_syncable_service_unittest.cc#newcode156 chrome/browser/password_manager/password_syncable_service_unittest.cc:156: std::vector<autofill::PasswordForm>* password_list) ...
7 years, 1 month ago (2013-10-30 23:57:18 UTC) #10
lipalani1
PTAL. https://codereview.chromium.org/27233003/diff/263001/chrome/browser/password_manager/password_syncable_service_unittest.cc File chrome/browser/password_manager/password_syncable_service_unittest.cc (right): https://codereview.chromium.org/27233003/diff/263001/chrome/browser/password_manager/password_syncable_service_unittest.cc#newcode35 chrome/browser/password_manager/password_syncable_service_unittest.cc:35: namespace { On 2013/10/30 23:57:18, Nicolas Zea wrote: ...
7 years, 1 month ago (2013-10-31 19:22:18 UTC) #11
Nicolas Zea
https://codereview.chromium.org/27233003/diff/263001/chrome/browser/password_manager/password_syncable_service_unittest.cc File chrome/browser/password_manager/password_syncable_service_unittest.cc (right): https://codereview.chromium.org/27233003/diff/263001/chrome/browser/password_manager/password_syncable_service_unittest.cc#newcode208 chrome/browser/password_manager/password_syncable_service_unittest.cc:208: scoped_ptr<TestSyncChangeProcessor>* sync_change_processor() { On 2013/10/31 19:22:18, lipalani1 wrote: > ...
7 years, 1 month ago (2013-10-31 22:41:56 UTC) #12
lipalani1
PTAL https://codereview.chromium.org/27233003/diff/373001/chrome/browser/password_manager/password_syncable_service_unittest.cc File chrome/browser/password_manager/password_syncable_service_unittest.cc (right): https://codereview.chromium.org/27233003/diff/373001/chrome/browser/password_manager/password_syncable_service_unittest.cc#newcode255 chrome/browser/password_manager/password_syncable_service_unittest.cc:255: scoped_ptr<syncer::SyncErrorFactory>() On 2013/10/31 22:41:56, Nicolas Zea wrote: > ...
7 years, 1 month ago (2013-10-31 23:26:30 UTC) #13
Nicolas Zea
lgtm
7 years, 1 month ago (2013-11-01 17:49:39 UTC) #14
lipalani1
Ilya - Would you mind doing a review so as to get a LGTM from ...
7 years, 1 month ago (2013-11-01 19:28:04 UTC) #15
Nicolas Zea
https://codereview.chromium.org/27233003/diff/423001/chrome/browser/password_manager/password_syncable_service.h File chrome/browser/password_manager/password_syncable_service.h (right): https://codereview.chromium.org/27233003/diff/423001/chrome/browser/password_manager/password_syncable_service.h#newcode74 chrome/browser/password_manager/password_syncable_service.h:74: PasswordEntryMap; I just realized this contains iterators to another ...
7 years, 1 month ago (2013-11-01 21:45:33 UTC) #16
lipalani1
good point, Agreed. Changed it to pointers.
7 years, 1 month ago (2013-11-01 22:23:13 UTC) #17
lipalani1
On 2013/11/01 22:23:13, lipalani1 wrote: > good point, Agreed. > > Changed it to pointers. ...
7 years, 1 month ago (2013-11-01 22:32:30 UTC) #18
Nicolas Zea
lgtm
7 years, 1 month ago (2013-11-01 22:35:22 UTC) #19
Ilya Sherman
Sorry, been in M32 crunch mode today. I have one trivial nit for the one ...
7 years, 1 month ago (2013-11-02 02:05:00 UTC) #20
Ilya Sherman
https://codereview.chromium.org/27233003/diff/503001/chrome/browser/password_manager/password_syncable_service.cc File chrome/browser/password_manager/password_syncable_service.cc (right): https://codereview.chromium.org/27233003/diff/503001/chrome/browser/password_manager/password_syncable_service.cc#newcode20 chrome/browser/password_manager/password_syncable_service.cc:20: // local password and stores the output in the ...
7 years, 1 month ago (2013-11-05 08:39:21 UTC) #21
lipalani1
Ilya - PTAL. https://codereview.chromium.org/27233003/diff/503001/chrome/browser/password_manager/password_syncable_service.cc File chrome/browser/password_manager/password_syncable_service.cc (right): https://codereview.chromium.org/27233003/diff/503001/chrome/browser/password_manager/password_syncable_service.cc#newcode20 chrome/browser/password_manager/password_syncable_service.cc:20: // local password and stores the ...
7 years, 1 month ago (2013-11-19 00:46:53 UTC) #22
Ilya Sherman
Thanks, I really like where this is headed. https://chromiumcodereview.appspot.com/27233003/diff/503001/chrome/browser/password_manager/password_syncable_service.h File chrome/browser/password_manager/password_syncable_service.h (right): https://chromiumcodereview.appspot.com/27233003/diff/503001/chrome/browser/password_manager/password_syncable_service.h#newcode79 chrome/browser/password_manager/password_syncable_service.h:79: // ...
7 years, 1 month ago (2013-11-19 22:49:03 UTC) #23
lipalani1
PTAL https://codereview.chromium.org/27233003/diff/633001/chrome/browser/password_manager/password_syncable_service.cc File chrome/browser/password_manager/password_syncable_service.cc (right): https://codereview.chromium.org/27233003/diff/633001/chrome/browser/password_manager/password_syncable_service.cc#newcode53 chrome/browser/password_manager/password_syncable_service.cc:53: } it calls into other private methods inside ...
7 years ago (2013-11-26 23:31:34 UTC) #24
Ilya Sherman
7 years ago (2013-12-05 07:01:53 UTC) #25
Apologies for the long delay in getting back to this review.  I was perf sheriff
last week, and have been furiously catching up on everything else this week.

https://codereview.chromium.org/27233003/diff/633001/chrome/browser/password_...
File chrome/browser/password_manager/password_syncable_service.cc (right):

https://codereview.chromium.org/27233003/diff/633001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.cc:70:
specifics.password().client_only_encrypted_data());
Ok.  That is a pretty confusing name for the field, since it stores *decrypted*
data on the client side.  Any chance of renaming it?  (I understand that this is
outside the scope of this CL.)

On 2013/11/26 23:31:35, lipalani1 wrote:
> This is the way things are stored in sync internally.
> 
> Passwords data are encrypted before they are shared with the server. When
> clients receive this encrypted data from the server, it will be decrypted and
> this decrypted data(stored in client_only_encrypted_data) is used for
populating
> the password store.
>
> On 2013/11/19 22:49:04, Ilya Sherman wrote:
> > Could you explain to me what |client_only_encrypted_data| means?  In
> > MergeLocalAndSyncPasswords(), it looks like you compare
PasswordSpecificsData
> to
> > unencrypted local data.  What does the "encrypted" part of the field name
> mean,
> > then?
>

https://codereview.chromium.org/27233003/diff/633001/chrome/browser/password_...
File chrome/browser/password_manager/password_syncable_service.h (right):

https://codereview.chromium.org/27233003/diff/633001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.h:74: friend class
TestSyncChangeProcessor;
My understanding is that you just want to be able to use the static methods
CreateSyncData and ExtractPasswordFromSpecifics.  If so, you can do this like
so:

class TestPasswordSyncableService : public PasswordSyncableService {
 public:
  TestPasswordSyncableService() {}
  virtual ~TestPasswordSyncableService() {}

  using PasswordSyncableService::CreateSyncData;
  using PasswordSyncableService::ExtractPasswordFromSpecifics;

 private:
  DISALLOW_COPY_AND_ASSIGN(TestPasswordSyncableService);
};

Or, even better, you could do something like:

# In password_syncable_service.cc

namespace internal {

syncer::SyncData CreateSyncData(const autofill::PasswordForm& password) {
  // impl
}

void ExtractPasswordFromSpecifics(...) {
  // impl
}

}  // namespace internal

# In password_syncable_service_unittest.cc

// Forward-declare internal functions shared with tests:

namespace internal {

syncer::SyncData CreateSyncData(const autofill::PasswordForm& password);
void ExtractPasswordFromSpecifics(...);

}

You can then call these free functions from the test code, but they are not
exported as part of the header.  You can then also tuck functions that need to
call these into an anonymous namespace, if those functions themselves don't need
to be exported.  This isn't just a weird idea that I invented -- this was *the*
pattern recommended to me by my C++ readability reviewer.

On 2013/11/26 23:31:35, lipalani1 wrote:
> These classes need to use private helpers to reduce their complexity. The
> inheritance relationship does not make sense as they test something
else.(i.e,.
> we would have to do multiple inheritance).
>
> On 2013/11/19 22:49:04, Ilya Sherman wrote:
> > Please do not add friend classes.  Instead, use protected methods that tests
> can
> > override.
>

https://codereview.chromium.org/27233003/diff/633001/chrome/browser/password_...
File chrome/browser/password_manager/password_syncable_service_unittest.cc
(right):

https://codereview.chromium.org/27233003/diff/633001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service_unittest.cc:160: void
VerifyChange(const autofill::PasswordForm& password,
This is a private method, so the only callers are the ones that care about
internal details.  This is an observable side-effect outside of this method, and
a surprising one to at least one reader of this code (i.e. it surprised me). 
Please add docs to *this* method, i.e. VerifyChange().

On 2013/11/26 23:31:35, lipalani1 wrote:
> That is an internal detail which the callers need not care about.
> 
> Other than that the name is clear on what it does. But in any case I have
added
> the comment.
>
> On 2013/11/19 22:49:04, Ilya Sherman wrote:
> > nit: Docs, especially mentioning the side-effect (the erase() call).
>

https://codereview.chromium.org/27233003/diff/633001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service_unittest.cc:226: //
FillBlacklistLogins.
On 2013/11/26 23:31:35, lipalani1 wrote:
> On 2013/11/19 22:49:04, Ilya Sherman wrote:
> > I'm not comfortable with checking in untested production code for
blacklisted
> > logins.  If you don't think it's appropriate to add test coverage as part of
> > this CL, please also hold off on adding the production code, and log a bug
to
> > help make sure this doesn't get lost.
> 
> Done.

Could you please annotate the corresponding production code with the tracking
bug to restore this functionality?

https://codereview.chromium.org/27233003/diff/633001/sync/api/sync_error.cc
File sync/api/sync_error.cc (right):

https://codereview.chromium.org/27233003/diff/633001/sync/api/sync_error.cc#n...
sync/api/sync_error.cc:144: MODEL_TYPE_COUNT);
Hmm, I don't see it included in the files modified by this CL, nor do I see
"Sync.LocalDataFailedToLoad" listed in histograms.xml.  What do you mean by "It
is already there"?

On 2013/11/26 23:31:35, lipalani1 wrote:
> It is already there.
>
> On 2013/11/19 22:49:04, Ilya Sherman wrote:
> > Please add this to histograms.xml as part of this CL.
>

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
File chrome/browser/password_manager/password_syncable_service.cc (right):

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.cc:8: #include
"base/memory/scoped_vector.h"
nit: Redundant with the header's include.

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.cc:9: #include
"base/metrics/histogram.h"
nit: unused.

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.cc:10: #include
"base/stl_util.h"
nit: unused?

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.cc:53: }
nit: Please arrange the code in the implementation file to match the order in
the header file.

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.cc:73: // Check
whether the data from sync is already in password store.
nit: "in password store" -> "in the password store"

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.cc:74:
PasswordEntryMap::iterator umatched_data_from_password_db_iter =
nit: Perhaps name this something more like "existing_local_entry" or
"existing_entry_from_password_db"?

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.cc:77:
umatched_data_from_password_db->end()) {
nit: Please indent this line four more spaces.

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.cc:94: // than
checking we simply update both.
Is it actually possible that both need to be updated?  If so, how?  Looking at
the code, it looks like one is always newer.

If I'm understanding the code correctly, perhaps a more accurate comment would
be something like: "Rather than checking which database -- sync or local --
needs updating, simply push an update to both.  This will end up being a no-op
for the database that didn't need an update."

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.cc:150: // Changes
from password db that needs to be propagated to sync.
nit: "needs" -> "need"

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.cc:177:
CreateSyncData(*(it->second))));
nit: Please align all three arguments to syncer::SyncChange().

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
File chrome/browser/password_manager/password_syncable_service.h (right):

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.h:82: // in the
passwords db. Depending on what action needs to be performed the
nit: "needs to be performed the" -> "needs to be performed, the"

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.h:83: // entry may be
added to |new_entries| or |updated_entries|. If the item is
nit: "to |new_entries| or |updated_entries|" -> "to |new_entries| or to
|updated_entries|"

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.h:84: // identical to
an entry in passwords db, no action is performed. If an
nit: "in passwords db" -> "in the passwords db"

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.h:85: // item needs to
be updated in the sync database then the item is also
nit: Might as well be consistent about "database" vs. "db"

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.h:85: // item needs to
be updated in the sync database then the item is also
nit: "in the sync database then" -> "in the sync database, then"

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service.h:87: //  entry's tag
in |umatched_data_from_password_db| then that entry
nit: Spurious leading whitespace.

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
File chrome/browser/password_manager/password_syncable_service_unittest.cc
(right):

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service_unittest.cc:15:
#include "chrome/browser/password_manager/password_syncable_service.h"
nit: This include should be at the very top -- see
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Names_and_Orde...

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service_unittest.cc:49: class
TestPasswordSyncableService : public PasswordSyncableService {
nit: TestPasswordSyncableService -> MockPasswordSyncableService

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service_unittest.cc:170: //
list.
nit: Please document here as well that the entry will be removed if found.  This
is an externally observable side-effect, since a client calling
UpdateChangeCount() before and after this method would see different results.

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service_unittest.cc:218: }
nit: The anonymous namespace should end here.  The actual test code should not
be in the anonymous namespace, as otherwise the ensuing name-mangling can cause
problems for our test runners.

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service_unittest.cc:312:
scoped_ptr<syncer::SyncErrorFactory>());
nit: Please align params.

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service_unittest.cc:319:
autofill::PasswordForm *form1 = new autofill::PasswordForm;
nit: "autofill::PasswordForm *form1" -> "scoped_ptr<autofill::PasswordForm>
form1"  (applies throughout)

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service_unittest.cc:322:
std::vector<autofill::PasswordForm*> forms;
nit: ScopedVector (applies throughout)

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service_unittest.cc:325:
SyncDataList list;
nit: You could just pass SyncDataList() on line 333.

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service_unittest.cc:357:
scoped_ptr<syncer::SyncErrorFactory>());
nit: Align args.

https://codereview.chromium.org/27233003/diff/743001/chrome/browser/password_...
chrome/browser/password_manager/password_syncable_service_unittest.cc:392:
scoped_ptr<syncer::SyncErrorFactory>());
nit: Align args.

https://codereview.chromium.org/27233003/diff/743001/sync/api/sync_error.h
File sync/api/sync_error.h (right):

https://codereview.chromium.org/27233003/diff/743001/sync/api/sync_error.h#ne...
sync/api/sync_error.h:79: static void LogDataLoadFailure(ModelType model_type);
nit: Please leave a blank line after this one.

Powered by Google App Engine
This is Rietveld 408576698