1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/api/spellcheck/spellcheck_api.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/lazy_instance.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_factory.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_service.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/api/spellcheck/spellcheck_handler.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/browser/extension_registry.h" 12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "extensions/common/manifest_constants.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace extensions { 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace errors = manifest_errors; 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SpellcheckDictionaryInfo* GetSpellcheckDictionaryInfo( 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Extension* extension) { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SpellcheckDictionaryInfo *spellcheck_info = 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<SpellcheckDictionaryInfo*>( 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) extension->GetManifestData(manifest_keys::kSpellcheck)); 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return spellcheck_info; 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)SpellcheckService::DictionaryFormat GetDictionaryFormat( 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& format) { 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (format == "hunspell") { 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SpellcheckService::DICT_HUNSPELL; 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (format == "text") { 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SpellcheckService::DICT_TEXT; 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return SpellcheckService::DICT_UNKNOWN; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuSpellcheckAPI::SpellcheckAPI(content::BrowserContext* context) 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : extension_registry_observer_(this) { 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu extension_registry_observer_.Add(ExtensionRegistry::Get(context)); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SpellcheckAPI::~SpellcheckAPI() { 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static base::LazyInstance<BrowserContextKeyedAPIFactory<SpellcheckAPI> > 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) g_factory = LAZY_INSTANCE_INITIALIZER; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BrowserContextKeyedAPIFactory<SpellcheckAPI>* 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SpellcheckAPI::GetFactoryInstance() { 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return g_factory.Pointer(); 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid SpellcheckAPI::OnExtensionLoaded(content::BrowserContext* browser_context, 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const Extension* extension) { 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SpellcheckDictionaryInfo* spellcheck_info = 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetSpellcheckDictionaryInfo(extension); 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (spellcheck_info) { 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(rlp): Handle load failure. = 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SpellcheckService* spellcheck = 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SpellcheckServiceFactory::GetForContext(browser_context); 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu spellcheck->LoadExternalDictionary( 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu spellcheck_info->language, 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu spellcheck_info->locale, 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu spellcheck_info->path, 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetDictionaryFormat(spellcheck_info->format)); 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid SpellcheckAPI::OnExtensionUnloaded( 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu content::BrowserContext* browser_context, 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const Extension* extension, 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu UnloadedExtensionInfo::Reason reason) { 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SpellcheckDictionaryInfo* spellcheck_info = 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetSpellcheckDictionaryInfo(extension); 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (spellcheck_info) { 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(rlp): Handle unload failure. 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SpellcheckService* spellcheck = 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SpellcheckServiceFactory::GetForContext(browser_context); 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu spellcheck->UnloadExternalDictionary(spellcheck_info->path); 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <> 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BrowserContextKeyedAPIFactory<SpellcheckAPI>::DeclareFactoryDependencies() { 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DependsOn(SpellcheckServiceFactory::GetInstance()); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace extensions 94