| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "sync/internal_api/js_sync_encryption_handler_observer.h" | 
 |  | 
 | #include <cstddef> | 
 |  | 
 | #include "base/location.h" | 
 | #include "base/logging.h" | 
 | #include "base/strings/string_number_conversions.h" | 
 | #include "base/values.h" | 
 | #include "sync/internal_api/public/base/model_type.h" | 
 | #include "sync/internal_api/public/util/sync_string_conversions.h" | 
 | #include "sync/js/js_event_details.h" | 
 | #include "sync/js/js_event_handler.h" | 
 | #include "sync/util/cryptographer.h" | 
 | #include "sync/util/time.h" | 
 |  | 
 | namespace syncer { | 
 |  | 
 | JsSyncEncryptionHandlerObserver::JsSyncEncryptionHandlerObserver() {} | 
 |  | 
 | JsSyncEncryptionHandlerObserver::~JsSyncEncryptionHandlerObserver() {} | 
 |  | 
 | void JsSyncEncryptionHandlerObserver::SetJsEventHandler( | 
 |     const WeakHandle<JsEventHandler>& event_handler) { | 
 |   event_handler_ = event_handler; | 
 | } | 
 |  | 
 | void JsSyncEncryptionHandlerObserver::OnPassphraseRequired( | 
 |     PassphraseRequiredReason reason, | 
 |     const sync_pb::EncryptedData& pending_keys) { | 
 |   if (!event_handler_.IsInitialized()) { | 
 |     return; | 
 |   } | 
 |   base::DictionaryValue details; | 
 |   details.SetString("reason", | 
 |                      PassphraseRequiredReasonToString(reason)); | 
 |   HandleJsEvent(FROM_HERE, "onPassphraseRequired", JsEventDetails(&details)); | 
 | } | 
 |  | 
 | void JsSyncEncryptionHandlerObserver::OnPassphraseAccepted() { | 
 |   if (!event_handler_.IsInitialized()) { | 
 |     return; | 
 |   } | 
 |   base::DictionaryValue details; | 
 |   HandleJsEvent(FROM_HERE, "onPassphraseAccepted", JsEventDetails(&details)); | 
 | } | 
 |  | 
 | void JsSyncEncryptionHandlerObserver::OnBootstrapTokenUpdated( | 
 |     const std::string& boostrap_token, | 
 |     BootstrapTokenType type) { | 
 |   if (!event_handler_.IsInitialized()) { | 
 |     return; | 
 |   } | 
 |   base::DictionaryValue details; | 
 |   details.SetString("bootstrapToken", "<redacted>"); | 
 |   details.SetString("type", BootstrapTokenTypeToString(type)); | 
 |   HandleJsEvent(FROM_HERE, "onBootstrapTokenUpdated", JsEventDetails(&details)); | 
 | } | 
 |  | 
 | void JsSyncEncryptionHandlerObserver::OnEncryptedTypesChanged( | 
 |     ModelTypeSet encrypted_types, | 
 |     bool encrypt_everything) { | 
 |   if (!event_handler_.IsInitialized()) { | 
 |     return; | 
 |   } | 
 |   base::DictionaryValue details; | 
 |   details.Set("encryptedTypes", | 
 |               ModelTypeSetToValue(encrypted_types)); | 
 |   details.SetBoolean("encryptEverything", encrypt_everything); | 
 |   HandleJsEvent(FROM_HERE, | 
 |                 "onEncryptedTypesChanged", JsEventDetails(&details)); | 
 | } | 
 |  | 
 | void JsSyncEncryptionHandlerObserver::OnEncryptionComplete() { | 
 |   if (!event_handler_.IsInitialized()) { | 
 |     return; | 
 |   } | 
 |   base::DictionaryValue details; | 
 |   HandleJsEvent(FROM_HERE, "onEncryptionComplete", JsEventDetails()); | 
 | } | 
 |  | 
 | void JsSyncEncryptionHandlerObserver::OnCryptographerStateChanged( | 
 |     Cryptographer* cryptographer) { | 
 |   if (!event_handler_.IsInitialized()) { | 
 |     return; | 
 |   } | 
 |   base::DictionaryValue details; | 
 |   details.SetBoolean("ready", | 
 |                      cryptographer->is_ready()); | 
 |   details.SetBoolean("hasPendingKeys", | 
 |                      cryptographer->has_pending_keys()); | 
 |   HandleJsEvent(FROM_HERE, | 
 |                 "onCryptographerStateChanged", | 
 |                 JsEventDetails(&details)); | 
 | } | 
 |  | 
 | void JsSyncEncryptionHandlerObserver::OnPassphraseTypeChanged( | 
 |     PassphraseType type, | 
 |     base::Time explicit_passphrase_time) { | 
 |   if (!event_handler_.IsInitialized()) { | 
 |     return; | 
 |   } | 
 |   base::DictionaryValue details; | 
 |   details.SetString("passphraseType", | 
 |                     PassphraseTypeToString(type)); | 
 |   details.SetInteger("explicitPassphraseTime", | 
 |                      TimeToProtoTime(explicit_passphrase_time)); | 
 |   HandleJsEvent(FROM_HERE, | 
 |                 "onPassphraseTypeChanged", | 
 |                 JsEventDetails(&details)); | 
 | } | 
 |  | 
 | void JsSyncEncryptionHandlerObserver::OnLocalSetPassphraseEncryption( | 
 |     const SyncEncryptionHandler::NigoriState& nigori_state) { | 
 | } | 
 |  | 
 | void JsSyncEncryptionHandlerObserver::HandleJsEvent( | 
 |     const tracked_objects::Location& from_here, | 
 |     const std::string& name, const JsEventDetails& details) { | 
 |   if (!event_handler_.IsInitialized()) { | 
 |     NOTREACHED(); | 
 |     return; | 
 |   } | 
 |   event_handler_.Call(from_here, | 
 |                       &JsEventHandler::HandleJsEvent, name, details); | 
 | } | 
 |  | 
 | }  // namespace syncer |