12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/test/integration/dictionary_helper.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <algorithm> 890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/format_macros.h" 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/strings/stringprintf.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_factory.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_service.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/test/integration/dictionary_load_observer.h" 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/sync/test/integration/multi_client_status_change_checker.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/sync/test/integration/single_client_status_change_checker.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_datatype_helper.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_test.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/spellcheck_common.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_utils.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DictionarySyncIntegrationTestHelper { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Same as SpellcheckCustomDictionary::AddWord/RemoveWord, except does not 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // write to disk. 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static bool ApplyChange( 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpellcheckCustomDictionary* dictionary, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpellcheckCustomDictionary::Change& change) { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result = change.Sanitize(dictionary->GetWords()); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary->Apply(change); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary->Notify(change); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary->Sync(change); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !result; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DictionarySyncIntegrationTestHelper); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace dictionary_helper { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpellcheckCustomDictionary* GetDictionary(int index) { 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return SpellcheckServiceFactory::GetForContext( 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_datatype_helper::test()->GetProfile(index))->GetCustomDictionary(); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SpellcheckCustomDictionary* GetVerifierDictionary() { 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return SpellcheckServiceFactory::GetForContext( 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_datatype_helper::test()->verifier())->GetCustomDictionary(); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoadDictionary(SpellcheckCustomDictionary* dictionary) { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dictionary->IsLoaded()) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::RunLoop run_loop; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DictionaryLoadObserver observer(content::GetQuitTaskForRunLoop(&run_loop)); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary->AddObserver(&observer); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary->Load(); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RunThisRunLoop(&run_loop); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary->RemoveObserver(&observer); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(dictionary->IsLoaded()); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LoadDictionaries() { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadDictionary(GetDictionary(i)); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (sync_datatype_helper::test()->use_verifier()) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadDictionary(GetVerifierDictionary()); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t GetDictionarySize(int index) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetDictionary(index)->GetWords().size(); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t GetVerifierDictionarySize() { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetVerifierDictionary()->GetWords().size(); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DictionariesMatch() { 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const chrome::spellcheck_common::WordSet& reference = 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) sync_datatype_helper::test()->use_verifier() 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ? GetVerifierDictionary()->GetWords() 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : GetDictionary(0)->GetWords(); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i) { 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const chrome::spellcheck_common::WordSet& dictionary = 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetDictionary(i)->GetWords(); 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (reference.size() != dictionary.size() || 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) !std::equal(reference.begin(), reference.end(), dictionary.begin())) { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace { 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Helper class used in the implementation of AwaitDictionariesMatch. 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass DictionaryMatchStatusChecker : public MultiClientStatusChangeChecker { 105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DictionaryMatchStatusChecker(); 107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~DictionaryMatchStatusChecker(); 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual bool IsExitConditionSatisfied() OVERRIDE; 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual std::string GetDebugMessage() const OVERRIDE; 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochDictionaryMatchStatusChecker::DictionaryMatchStatusChecker() 114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : MultiClientStatusChangeChecker( 115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_datatype_helper::test()->GetSyncServices()) {} 116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochDictionaryMatchStatusChecker::~DictionaryMatchStatusChecker() {} 118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool DictionaryMatchStatusChecker::IsExitConditionSatisfied() { 120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return DictionariesMatch(); 121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string DictionaryMatchStatusChecker::GetDebugMessage() const { 124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return "Waiting for matching dictionaries"; 125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Helper class used in the implementation of AwaitNumDictionaryEntries. 128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass NumDictionaryEntriesStatusChecker 129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : public SingleClientStatusChangeChecker { 130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NumDictionaryEntriesStatusChecker(int index, size_t num_words); 132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~NumDictionaryEntriesStatusChecker(); 133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual bool IsExitConditionSatisfied() OVERRIDE; 135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual std::string GetDebugMessage() const OVERRIDE; 136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private: 137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int index_; 138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch size_t num_words_; 139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochNumDictionaryEntriesStatusChecker::NumDictionaryEntriesStatusChecker( 142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int index, size_t num_words) 143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : SingleClientStatusChangeChecker( 144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch sync_datatype_helper::test()->GetSyncService(index)), 145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch index_(index), 146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch num_words_(num_words) {} 147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochNumDictionaryEntriesStatusChecker::~NumDictionaryEntriesStatusChecker() {} 149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool NumDictionaryEntriesStatusChecker::IsExitConditionSatisfied() { 151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return GetDictionarySize(index_) == num_words_; 152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string NumDictionaryEntriesStatusChecker::GetDebugMessage() const { 155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return base::StringPrintf( 156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "Waiting for client %d: %" PRIuS " / %" PRIuS " words downloaded", 157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch index_, GetDictionarySize(index_), num_words_); 158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace 161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool AwaitDictionariesMatch() { 163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DictionaryMatchStatusChecker checker; 164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch checker.Wait(); 165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return !checker.TimedOut(); 166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool AwaitNumDictionaryEntries(int index, size_t num_words) { 169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NumDictionaryEntriesStatusChecker checker(index, num_words); 170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch checker.Wait(); 171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return !checker.TimedOut(); 172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DictionaryMatchesVerifier(int index) { 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const chrome::spellcheck_common::WordSet& expected = 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetVerifierDictionary()->GetWords(); 17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const chrome::spellcheck_common::WordSet& actual = 17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetDictionary(index)->GetWords(); 17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return expected.size() == actual.size() && 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::equal(expected.begin(), expected.end(), actual.begin()); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool AddWord(int index, const std::string& word) { 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpellcheckCustomDictionary::Change dictionary_change; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_change.AddWord(word); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = DictionarySyncIntegrationTestHelper::ApplyChange( 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDictionary(index), dictionary_change); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (sync_datatype_helper::test()->use_verifier()) { 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result &= DictionarySyncIntegrationTestHelper::ApplyChange( 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetVerifierDictionary(), dictionary_change); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RemoveWord(int index, const std::string& word) { 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpellcheckCustomDictionary::Change dictionary_change; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_change.RemoveWord(word); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = DictionarySyncIntegrationTestHelper::ApplyChange( 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDictionary(index), dictionary_change); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (sync_datatype_helper::test()->use_verifier()) { 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result &= DictionarySyncIntegrationTestHelper::ApplyChange( 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetVerifierDictionary(), dictionary_change); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace dictionary_helper 208