1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/extensions/extension_apitest.h" 6 7#include <vector> 8 9#include "base/command_line.h" 10#include "base/memory/ref_counted.h" 11#include "base/strings/stringprintf.h" 12#include "chrome/browser/chromeos/extensions/input_method_event_router.h" 13#include "chrome/browser/chromeos/input_method/input_method_util.h" 14#include "chromeos/ime/extension_ime_util.h" 15#include "chromeos/ime/input_method_manager.h" 16#include "content/public/browser/notification_observer.h" 17#include "content/public/browser/notification_registrar.h" 18#include "content/public/browser/notification_service.h" 19#include "extensions/common/switches.h" 20#include "extensions/browser/api/test/test_api.h" 21#include "extensions/browser/notification_types.h" 22#include "testing/gtest/include/gtest/gtest.h" 23 24namespace { 25 26const char kLoginScreenUILanguage[] = "fr"; 27const char kInitialInputMethodOnLoginScreen[] = "xkb:us::eng"; 28const char kBackgroundReady[] = "ready"; 29 30// Class that listens for the JS message. 31class TestListener : public content::NotificationObserver { 32 public: 33 TestListener() { 34 registrar_.Add(this, 35 extensions::NOTIFICATION_EXTENSION_TEST_MESSAGE, 36 content::NotificationService::AllSources()); 37 } 38 39 virtual ~TestListener() {} 40 41 // Implements the content::NotificationObserver interface. 42 virtual void Observe(int type, 43 const content::NotificationSource& source, 44 const content::NotificationDetails& details) OVERRIDE { 45 const std::string& content = *content::Details<std::string>(details).ptr(); 46 if (content == kBackgroundReady) { 47 // Initializes IMF for testing when receives ready message from 48 // background. 49 chromeos::input_method::InputMethodManager* manager = 50 chromeos::input_method::InputMethodManager::Get(); 51 manager->GetInputMethodUtil()->InitXkbInputMethodsForTesting(); 52 53 std::vector<std::string> keyboard_layouts; 54 keyboard_layouts.push_back( 55 chromeos::extension_ime_util::GetInputMethodIDByEngineID( 56 kInitialInputMethodOnLoginScreen)); 57 manager->GetActiveIMEState()->EnableLoginLayouts(kLoginScreenUILanguage, 58 keyboard_layouts); 59 } 60 } 61 62 private: 63 content::NotificationRegistrar registrar_; 64}; 65 66class ExtensionInputMethodApiTest : public ExtensionApiTest { 67 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 68 ExtensionApiTest::SetUpCommandLine(command_line); 69 command_line->AppendSwitchASCII( 70 extensions::switches::kWhitelistedExtensionID, 71 "ilanclmaeigfpnmdlgelmhkpkegdioip"); 72 } 73}; 74 75} // namespace 76 77IN_PROC_BROWSER_TEST_F(ExtensionInputMethodApiTest, Basic) { 78 // Listener for extension's background ready. 79 TestListener listener; 80 81 ASSERT_TRUE(RunExtensionTest("input_method")) << message_; 82} 83