| Index: chrome/browser/sync/internal_api/write_node.cc
 | 
| diff --git a/chrome/browser/sync/internal_api/write_node.cc b/chrome/browser/sync/internal_api/write_node.cc
 | 
| index 8bfcc86eb62322d753a7cc3f2937b371acd0a974..84d0f79b65928ba1ba5cbfb629f7f3b5b69ab836 100644
 | 
| --- a/chrome/browser/sync/internal_api/write_node.cc
 | 
| +++ b/chrome/browser/sync/internal_api/write_node.cc
 | 
| @@ -4,15 +4,12 @@
 | 
|  
 | 
|  #include "chrome/browser/sync/internal_api/write_node.h"
 | 
|  
 | 
| -#include "base/json/json_writer.h"
 | 
|  #include "base/utf_string_conversions.h"
 | 
|  #include "base/values.h"
 | 
| -#include "chrome/browser/sync/engine/nigori_util.h"
 | 
| -#include "chrome/browser/sync/engine/syncapi_internal.h"
 | 
| +#include "chrome/browser/sync/internal_api/syncapi_internal.h"
 | 
|  #include "chrome/browser/sync/internal_api/base_transaction.h"
 | 
|  #include "chrome/browser/sync/internal_api/write_transaction.h"
 | 
| -#include "chrome/browser/sync/syncable/syncable.h"
 | 
| -#include "chrome/browser/sync/util/cryptographer.h"
 | 
| +#include "sync/engine/nigori_util.h"
 | 
|  #include "sync/protocol/app_specifics.pb.h"
 | 
|  #include "sync/protocol/autofill_specifics.pb.h"
 | 
|  #include "sync/protocol/bookmark_specifics.pb.h"
 | 
| @@ -21,6 +18,8 @@
 | 
|  #include "sync/protocol/session_specifics.pb.h"
 | 
|  #include "sync/protocol/theme_specifics.pb.h"
 | 
|  #include "sync/protocol/typed_url_specifics.pb.h"
 | 
| +#include "sync/syncable/syncable.h"
 | 
| +#include "sync/util/cryptographer.h"
 | 
|  
 | 
|  using browser_sync::Cryptographer;
 | 
|  using std::string;
 | 
| @@ -32,95 +31,6 @@ namespace sync_api {
 | 
|  
 | 
|  static const char kDefaultNameForNewNodes[] = " ";
 | 
|  
 | 
| -bool WriteNode::UpdateEntryWithEncryption(
 | 
| -    browser_sync::Cryptographer* cryptographer,
 | 
| -    const sync_pb::EntitySpecifics& new_specifics,
 | 
| -    syncable::MutableEntry* entry) {
 | 
| -  syncable::ModelType type = syncable::GetModelTypeFromSpecifics(new_specifics);
 | 
| -  DCHECK_GE(type, syncable::FIRST_REAL_MODEL_TYPE);
 | 
| -  const sync_pb::EntitySpecifics& old_specifics = entry->Get(SPECIFICS);
 | 
| -  const syncable::ModelTypeSet encrypted_types =
 | 
| -      cryptographer->GetEncryptedTypes();
 | 
| -  // It's possible the nigori lost the set of encrypted types. If the current
 | 
| -  // specifics are already encrypted, we want to ensure we continue encrypting.
 | 
| -  bool was_encrypted = old_specifics.has_encrypted();
 | 
| -  sync_pb::EntitySpecifics generated_specifics;
 | 
| -  if (new_specifics.has_encrypted()) {
 | 
| -    NOTREACHED() << "New specifics already has an encrypted blob.";
 | 
| -    return false;
 | 
| -  }
 | 
| -  if ((!SpecificsNeedsEncryption(encrypted_types, new_specifics) &&
 | 
| -       !was_encrypted) ||
 | 
| -      !cryptographer->is_initialized()) {
 | 
| -    // No encryption required or we are unable to encrypt.
 | 
| -    generated_specifics.CopyFrom(new_specifics);
 | 
| -  } else {
 | 
| -    // Encrypt new_specifics into generated_specifics.
 | 
| -    if (VLOG_IS_ON(2)) {
 | 
| -      scoped_ptr<DictionaryValue> value(entry->ToValue());
 | 
| -      std::string info;
 | 
| -      base::JSONWriter::Write(value.get(), true, &info);
 | 
| -      DVLOG(2) << "Encrypting specifics of type "
 | 
| -               << syncable::ModelTypeToString(type)
 | 
| -               << " with content: "
 | 
| -               << info;
 | 
| -    }
 | 
| -    // Only copy over the old specifics if it is of the right type and already
 | 
| -    // encrypted. The first time we encrypt a node we start from scratch, hence
 | 
| -    // removing all the unencrypted data, but from then on we only want to
 | 
| -    // update the node if the data changes or the encryption key changes.
 | 
| -    if (syncable::GetModelTypeFromSpecifics(old_specifics) == type &&
 | 
| -        was_encrypted) {
 | 
| -      generated_specifics.CopyFrom(old_specifics);
 | 
| -    } else {
 | 
| -      syncable::AddDefaultFieldValue(type, &generated_specifics);
 | 
| -    }
 | 
| -    // Does not change anything if underlying encrypted blob was already up
 | 
| -    // to date and encrypted with the default key.
 | 
| -    if (!cryptographer->Encrypt(new_specifics,
 | 
| -                                generated_specifics.mutable_encrypted())) {
 | 
| -      NOTREACHED() << "Could not encrypt data for node of type "
 | 
| -                   << syncable::ModelTypeToString(type);
 | 
| -      return false;
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  // It's possible this entry was encrypted but didn't properly overwrite the
 | 
| -  // non_unique_name (see crbug.com/96314).
 | 
| -  bool encrypted_without_overwriting_name = (was_encrypted &&
 | 
| -      entry->Get(syncable::NON_UNIQUE_NAME) != kEncryptedString);
 | 
| -
 | 
| -  // If we're encrypted but the name wasn't overwritten properly we still want
 | 
| -  // to rewrite the entry, irrespective of whether the specifics match.
 | 
| -  if (!encrypted_without_overwriting_name &&
 | 
| -      old_specifics.SerializeAsString() ==
 | 
| -          generated_specifics.SerializeAsString()) {
 | 
| -    DVLOG(2) << "Specifics of type " << syncable::ModelTypeToString(type)
 | 
| -             << " already match, dropping change.";
 | 
| -    return true;
 | 
| -  }
 | 
| -
 | 
| -  if (generated_specifics.has_encrypted()) {
 | 
| -    // Overwrite the possibly sensitive non-specifics data.
 | 
| -    entry->Put(syncable::NON_UNIQUE_NAME, kEncryptedString);
 | 
| -    // For bookmarks we actually put bogus data into the unencrypted specifics,
 | 
| -    // else the server will try to do it for us.
 | 
| -    if (type == syncable::BOOKMARKS) {
 | 
| -      sync_pb::BookmarkSpecifics* bookmark_specifics =
 | 
| -          generated_specifics.mutable_bookmark();
 | 
| -      if (!entry->Get(syncable::IS_DIR))
 | 
| -        bookmark_specifics->set_url(kEncryptedString);
 | 
| -      bookmark_specifics->set_title(kEncryptedString);
 | 
| -    }
 | 
| -  }
 | 
| -  entry->Put(syncable::SPECIFICS, generated_specifics);
 | 
| -  DVLOG(1) << "Overwriting specifics of type "
 | 
| -           << syncable::ModelTypeToString(type)
 | 
| -           << " and marking for syncing.";
 | 
| -  syncable::MarkForSyncing(entry);
 | 
| -  return true;
 | 
| -}
 | 
| -
 | 
|  void WriteNode::SetIsFolder(bool folder) {
 | 
|    if (entry_->Get(syncable::IS_DIR) == folder)
 | 
|      return;  // Skip redundant changes.
 | 
| 
 |