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)