| Index: components/policy/core/browser/policy_error_map.cc | 
| diff --git a/components/policy/core/browser/policy_error_map.cc b/components/policy/core/browser/policy_error_map.cc | 
| index 611260d3f8378b9850f90457cb857b44660b8cad..89453040f44bfe2dbaa8ef7fb0c30b2af321090b 100644 | 
| --- a/components/policy/core/browser/policy_error_map.cc | 
| +++ b/components/policy/core/browser/policy_error_map.cc | 
| @@ -15,37 +15,118 @@ | 
|  | 
| namespace policy { | 
|  | 
| -struct PolicyErrorMap::PendingError { | 
| -  PendingError(const std::string& policy, | 
| -               const std::string& subkey, | 
| -               int index, | 
| -               int message_id, | 
| -               const std::string& replacement) | 
| -      : policy(policy), | 
| -        subkey(subkey), | 
| -        index(index), | 
| -        message_id(message_id), | 
| -        has_replacement(true), | 
| -        replacement(replacement) {} | 
| - | 
| -  PendingError(const std::string& policy, | 
| -               const std::string& subkey, | 
| -               int index, | 
| -               int message_id) | 
| -      : policy(policy), | 
| -        subkey(subkey), | 
| -        index(index), | 
| -        message_id(message_id), | 
| -        has_replacement(false) {} | 
| - | 
| -  std::string policy; | 
| -  std::string subkey; | 
| -  int index; | 
| -  int message_id; | 
| -  bool has_replacement; | 
| -  std::string replacement; | 
| +class PolicyErrorMap::PendingError { | 
| + public: | 
| +  explicit PendingError(const std::string& policy_name) | 
| +      : policy_name_(policy_name) {} | 
| +  virtual ~PendingError() {} | 
| + | 
| +  const std::string& policy_name() const { return policy_name_; } | 
| + | 
| +  virtual base::string16 GetMessage() const = 0; | 
| + | 
| + private: | 
| +  std::string policy_name_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(PendingError); | 
| +}; | 
| + | 
| +namespace { | 
| + | 
| +class SimplePendingError : public PolicyErrorMap::PendingError { | 
| + public: | 
| +  SimplePendingError(const std::string& policy_name, | 
| +                     int message_id, | 
| +                     const std::string& replacement) | 
| +      : PendingError(policy_name), | 
| +        message_id_(message_id), | 
| +        replacement_(replacement) {} | 
| +  virtual ~SimplePendingError() {} | 
| + | 
| +  virtual base::string16 GetMessage() const OVERRIDE { | 
| +    if (message_id_ >= 0) { | 
| +      if (replacement_.empty()) | 
| +        return l10n_util::GetStringUTF16(message_id_); | 
| +      return l10n_util::GetStringFUTF16(message_id_, | 
| +                                        base::ASCIIToUTF16(replacement_)); | 
| +    } | 
| +    return base::ASCIIToUTF16(replacement_); | 
| +  } | 
| + | 
| + private: | 
| +  int message_id_; | 
| +  std::string replacement_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(SimplePendingError); | 
| +}; | 
| + | 
| +class DictSubkeyPendingError : public SimplePendingError { | 
| + public: | 
| +  DictSubkeyPendingError(const std::string& policy_name, | 
| +                         const std::string& subkey, | 
| +                         int message_id, | 
| +                         const std::string& replacement) | 
| +      : SimplePendingError(policy_name, message_id, replacement), | 
| +        subkey_(subkey) {} | 
| +  virtual ~DictSubkeyPendingError() {} | 
| + | 
| +  virtual base::string16 GetMessage() const OVERRIDE { | 
| +    return l10n_util::GetStringFUTF16(IDS_POLICY_SUBKEY_ERROR, | 
| +                                      base::ASCIIToUTF16(subkey_), | 
| +                                      SimplePendingError::GetMessage()); | 
| +  } | 
| + | 
| + private: | 
| +  std::string subkey_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(DictSubkeyPendingError); | 
| +}; | 
| + | 
| +class ListItemPendingError : public SimplePendingError { | 
| + public: | 
| +  ListItemPendingError(const std::string& policy_name, | 
| +                       int index, | 
| +                       int message_id, | 
| +                       const std::string& replacement) | 
| +      : SimplePendingError(policy_name, message_id, replacement), | 
| +        index_(index) {} | 
| +  virtual ~ListItemPendingError() {} | 
| + | 
| +  virtual base::string16 GetMessage() const OVERRIDE { | 
| +    return l10n_util::GetStringFUTF16(IDS_POLICY_LIST_ENTRY_ERROR, | 
| +                                      base::IntToString16(index_), | 
| +                                      SimplePendingError::GetMessage()); | 
| +  } | 
| + | 
| + private: | 
| +  int index_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(ListItemPendingError); | 
| +}; | 
| + | 
| +class SchemaValidatingPendingError : public SimplePendingError { | 
| + public: | 
| +  SchemaValidatingPendingError(const std::string& policy_name, | 
| +                               const std::string& error_path, | 
| +                               const std::string& replacement) | 
| +      : SimplePendingError(policy_name, -1, replacement), | 
| +        error_path_(error_path) {}; | 
| +  virtual ~SchemaValidatingPendingError() {} | 
| + | 
| +  virtual base::string16 GetMessage() const OVERRIDE { | 
| +    return l10n_util::GetStringFUTF16(IDS_POLICY_SCHEMA_VALIDATION_ERROR, | 
| +                                      base::ASCIIToUTF16(error_path_), | 
| +                                      SimplePendingError::GetMessage()); | 
| +  } | 
| + | 
| + private: | 
| +  std::string error_path_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(SchemaValidatingPendingError); | 
| }; | 
|  | 
| +}  // namespace | 
| + | 
| PolicyErrorMap::PolicyErrorMap() { | 
| } | 
|  | 
| @@ -57,39 +138,46 @@ bool PolicyErrorMap::IsReady() const { | 
| } | 
|  | 
| void PolicyErrorMap::AddError(const std::string& policy, int message_id) { | 
| -  AddError(PendingError(policy, std::string(), -1, message_id)); | 
| +  AddError(new SimplePendingError(policy, message_id, std::string())); | 
| } | 
|  | 
| void PolicyErrorMap::AddError(const std::string& policy, | 
| const std::string& subkey, | 
| int message_id) { | 
| -  AddError(PendingError(policy, subkey, -1, message_id)); | 
| +  AddError( | 
| +      new DictSubkeyPendingError(policy, subkey, message_id, std::string())); | 
| } | 
|  | 
| void PolicyErrorMap::AddError(const std::string& policy, | 
| int index, | 
| int message_id) { | 
| -  AddError(PendingError(policy, std::string(), index, message_id)); | 
| +  AddError(new ListItemPendingError(policy, index, message_id, std::string())); | 
| } | 
|  | 
| void PolicyErrorMap::AddError(const std::string& policy, | 
| int message_id, | 
| const std::string& replacement) { | 
| -  AddError(PendingError(policy, std::string(), -1, message_id, replacement)); | 
| +  AddError(new SimplePendingError(policy, message_id, replacement)); | 
| } | 
|  | 
| void PolicyErrorMap::AddError(const std::string& policy, | 
| const std::string& subkey, | 
| int message_id, | 
| const std::string& replacement) { | 
| -  AddError(PendingError(policy, subkey, -1, message_id, replacement)); | 
| +  AddError(new DictSubkeyPendingError(policy, subkey, message_id, replacement)); | 
| } | 
|  | 
| void PolicyErrorMap::AddError(const std::string& policy, | 
| int index, | 
| int message_id, | 
| const std::string& replacement) { | 
| -  AddError(PendingError(policy, std::string(), index, message_id, replacement)); | 
| +  AddError(new ListItemPendingError(policy, index, message_id, replacement)); | 
| +} | 
| + | 
| +void PolicyErrorMap::AddError(const std::string& policy, | 
| +                              const std::string& error_path, | 
| +                              const std::string& message) { | 
| +  AddError(new SchemaValidatingPendingError(policy, error_path, message)); | 
| } | 
|  | 
| base::string16 PolicyErrorMap::GetErrors(const std::string& policy) { | 
| @@ -126,36 +214,17 @@ void PolicyErrorMap::Clear() { | 
| map_.clear(); | 
| } | 
|  | 
| -void PolicyErrorMap::AddError(const PendingError& error) { | 
| +void PolicyErrorMap::AddError(PendingError* error) { | 
| if (IsReady()) { | 
| Convert(error); | 
| +    delete error; | 
| } else { | 
| pending_.push_back(error); | 
| } | 
| } | 
|  | 
| -void PolicyErrorMap::Convert(const PendingError& error) { | 
| -  base::string16 submessage; | 
| -  if (error.has_replacement) { | 
| -    submessage = l10n_util::GetStringFUTF16(error.message_id, | 
| -                                            base::ASCIIToUTF16( | 
| -                                                error.replacement)); | 
| -  } else { | 
| -    submessage = l10n_util::GetStringUTF16(error.message_id); | 
| -  } | 
| -  base::string16 message; | 
| -  if (!error.subkey.empty()) { | 
| -    message = l10n_util::GetStringFUTF16(IDS_POLICY_SUBKEY_ERROR, | 
| -                                         base::ASCIIToUTF16(error.subkey), | 
| -                                         submessage); | 
| -  } else if (error.index >= 0) { | 
| -    message = l10n_util::GetStringFUTF16(IDS_POLICY_LIST_ENTRY_ERROR, | 
| -                                         base::IntToString16(error.index), | 
| -                                         submessage); | 
| -  } else { | 
| -    message = submessage; | 
| -  } | 
| -  map_.insert(std::make_pair(error.policy, message)); | 
| +void PolicyErrorMap::Convert(PendingError* error) { | 
| +  map_.insert(std::make_pair(error->policy_name(), error->GetMessage())); | 
| } | 
|  | 
| void PolicyErrorMap::CheckReadyAndConvert() { | 
|  |