15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The |Misspelling| object stores the misspelling, a spellcheck suggestion for
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// it, and user's action on it. The misspelling is stored as |context|,
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |location|, and |length| instead of only misspelled text, because the
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// spellcheck algorithm uses the context.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/spellchecker/misspelling.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Builds a value from a list of spellcheck suggestions. The caller owns the
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// result.
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::Value* BuildSuggestionsValue(const std::vector<base::string16>& list) {
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::ListValue* result = new base::ListValue;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result->AppendStrings(list);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Builds a value from a spellcheck action. The caller owns the result.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::Value* BuildUserActionValue(const SpellcheckAction& action) {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ListValue* result = new base::ListValue;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->Append(action.Serialize());
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
30c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
31c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Misspelling::Misspelling()
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : location(0), length(0), hash(0), timestamp(base::Time::Now()) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Misspelling::Misspelling(const base::string16& context,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         size_t location,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         size_t length,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const std::vector<base::string16>& suggestions,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint32 hash)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : context(context),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location(location),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      length(length),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      suggestions(suggestions),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      hash(hash),
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      timestamp(base::Time::Now()) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Misspelling::~Misspelling() {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::DictionaryValue* Misspelling::Serialize() const {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* result = new base::DictionaryValue;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->SetString(
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "timestamp",
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Int64ToString(static_cast<long>(timestamp.ToJsTime())));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->SetInteger("misspelledLength", length);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->SetInteger("misspelledStart", location);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result->SetString("originalText", context);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->SetString("suggestionId", base::UintToString(hash));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->Set("suggestions", BuildSuggestionsValue(suggestions));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->Set("userActions", BuildUserActionValue(action));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::string16 Misspelling::GetMisspelledString() const {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Feedback sender does not create Misspelling objects for spellcheck results
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that are out-of-bounds of checked text length.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (location > context.length())
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::string16();
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return context.substr(location, length);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)