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