Chromium Code Reviews| Index: chrome/browser/ui/touch/keyboard/keyboard_manager.cc |
| diff --git a/chrome/browser/ui/touch/keyboard/keyboard_manager.cc b/chrome/browser/ui/touch/keyboard/keyboard_manager.cc |
| index 974642c0adae7d6bbdb673424b0ab2ab612373f0..1ebb707039b35743eb286cb8bc408a55b75fb4a7 100644 |
| --- a/chrome/browser/ui/touch/keyboard/keyboard_manager.cc |
| +++ b/chrome/browser/ui/touch/keyboard/keyboard_manager.cc |
| @@ -4,6 +4,9 @@ |
| #include "chrome/browser/ui/touch/keyboard/keyboard_manager.h" |
| +#include "base/json/json_writer.h" |
| +#include "base/values.h" |
| +#include "chrome/browser/extensions/extension_event_router.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/profiles/profile_manager.h" |
| #include "chrome/browser/tabs/tab_strip_model.h" |
| @@ -31,22 +34,8 @@ namespace { |
| const int kDefaultKeyboardHeight = 300; |
| const int kKeyboardSlideDuration = 300; // In milliseconds |
| - |
| -PropertyAccessor<bool>* GetFocusedStateAccessor() { |
| - static PropertyAccessor<bool> state; |
| - return &state; |
| -} |
| - |
| -// Returns whether the keyboard visibility should be affected by this tab. |
| -bool TabContentsCanAffectKeyboard(const TabContents* tab_contents) { |
| - // There may not be a browser, e.g. for the login window. But if there is |
| - // a browser, then |tab_contents| should be the active tab. |
| - Browser* browser = Browser::GetBrowserForController( |
| - &tab_contents->controller(), NULL); |
| - return browser == NULL || |
| - (browser == BrowserList::GetLastActive() && |
| - browser->GetSelectedTabContents() == tab_contents); |
| -} |
| +const char kOnTextInputTypeChanged[] = |
| + "experimental.input.onTextInputTypeChanged"; |
| } // namespace |
| @@ -82,17 +71,7 @@ KeyboardManager::KeyboardManager() |
| animation_->SetTweenType(ui::Tween::LINEAR); |
| animation_->SetSlideDuration(kKeyboardSlideDuration); |
| - // Start listening to notifications to maintain the keyboard visibility, size |
| - // etc. |
| - registrar_.Add(this, |
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| - NotificationService::AllSources()); |
| - registrar_.Add(this, |
| - content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE, |
| - NotificationService::AllSources()); |
| - registrar_.Add(this, |
| - content::NOTIFICATION_TAB_CONTENTS_DESTROYED, |
| - NotificationService::AllSources()); |
| + views::TextInputTypeTracker::GetInstance()->AddTextInputTypeObserver(this); |
| registrar_.Add(this, |
| chrome::NOTIFICATION_HIDE_KEYBOARD_INVOKED, |
| NotificationService::AllSources()); |
| @@ -114,6 +93,7 @@ KeyboardManager::KeyboardManager() |
| } |
| KeyboardManager::~KeyboardManager() { |
| + views::TextInputTypeTracker::GetInstance()->RemoveTextInputTypeObserver(this); |
| #if defined(OS_CHROMEOS) |
| chromeos::input_method::InputMethodManager* manager = |
| chromeos::input_method::InputMethodManager::GetInstance(); |
| @@ -162,14 +142,6 @@ void KeyboardManager::AnimationEnded(const ui::Animation* animation) { |
| Widget::Hide(); |
| } |
| -void KeyboardManager::OnBrowserAdded(const Browser* browser) { |
| - browser->tabstrip_model()->AddObserver(this); |
| -} |
| - |
| -void KeyboardManager::OnBrowserRemoved(const Browser* browser) { |
| - browser->tabstrip_model()->RemoveObserver(this); |
| -} |
| - |
| bool KeyboardManager::OnMessageReceived(const IPC::Message& message) { |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(KeyboardManager, message) |
| @@ -185,27 +157,53 @@ void KeyboardManager::OnRequest( |
| dom_view_->tab_contents()->render_view_host()); |
| } |
| -void KeyboardManager::ActiveTabChanged(TabContentsWrapper* old_contents, |
| - TabContentsWrapper* new_contents, |
| - int index, |
| - bool user_gesture) { |
| - TabContents* contents = new_contents->tab_contents(); |
| - if (!TabContentsCanAffectKeyboard(contents)) |
| - return; |
| - |
| - // If the tab contents does not have the focus, then it should not affect the |
| - // keyboard visibility. |
| - views::View* view = static_cast<TabContentsViewTouch*>(contents->view()); |
| - views::FocusManager* fmanager = view ? view->GetFocusManager() : NULL; |
| - if (!fmanager || !view->Contains(fmanager->GetFocusedView())) |
| - return; |
| - |
| - bool* editable = GetFocusedStateAccessor()->GetProperty( |
| - contents->property_bag()); |
| - if (editable && *editable) |
| - ShowKeyboardForWidget(view->GetWidget()); |
| - else |
| +void KeyboardManager::TextInputTypeChanged(ui::TextInputType type, |
| + views::Widget *widget) |
| +{ |
| + // Send onTextInputTypeChanged event to keyboard extension. |
| + ListValue args; |
|
bryeung
2011/08/03 22:22:04
Why a ListValue instead of a StringValue? Looks l
Peng
2011/08/04 19:47:53
ListValue is for creating arguments for onTextInpu
|
| + switch (type) { |
| + case ui::TEXT_INPUT_TYPE_NONE: |
|
bryeung
2011/08/03 22:22:04
Is this the right indentation? I was expecting ev
Peng
2011/08/04 19:47:53
Done.
|
| + args.Append(Value::CreateStringValue("none")); |
| + break; |
| + case ui::TEXT_INPUT_TYPE_TEXT: |
| + args.Append(Value::CreateStringValue("text")); |
| + break; |
| + case ui::TEXT_INPUT_TYPE_PASSWORD: |
| + args.Append(Value::CreateStringValue("password")); |
| + break; |
| + case ui::TEXT_INPUT_TYPE_SEARCH: |
| + args.Append(Value::CreateStringValue("search")); |
| + break; |
| + case ui::TEXT_INPUT_TYPE_EMAIL: |
| + args.Append(Value::CreateStringValue("email")); |
| + break; |
| + case ui::TEXT_INPUT_TYPE_NUMBER: |
| + args.Append(Value::CreateStringValue("number")); |
| + break; |
| + case ui::TEXT_INPUT_TYPE_TELEPHONE: |
| + args.Append(Value::CreateStringValue("tel")); |
| + break; |
| + case ui::TEXT_INPUT_TYPE_URL: |
| + args.Append(Value::CreateStringValue("url")); |
| + break; |
| + default: |
| + args.Append(Value::CreateStringValue("none")); |
| + break; |
| + } |
| + |
| + std::string json_args; |
| + base::JSONWriter::Write(&args, false, &json_args); |
| + |
| + Profile* profile = |
| + Profile::FromBrowserContext(dom_view_->tab_contents()->browser_context()); |
| + profile->GetExtensionEventRouter()->DispatchEventToRenderers( |
| + kOnTextInputTypeChanged, json_args, NULL, GURL()); |
|
sadrul
2011/08/03 23:01:14
Does this send the event to all extension renderer
Peng
2011/08/04 19:47:53
It will send the event to all extensions which lis
|
| + |
| + if (type == ui::TEXT_INPUT_TYPE_NONE) |
| Hide(); |
| + else |
| + ShowKeyboardForWidget(widget); |
| } |
| Browser* KeyboardManager::GetBrowser() { |
| @@ -238,69 +236,7 @@ void KeyboardManager::Observe(int type, |
| const NotificationSource& source, |
| const NotificationDetails& details) { |
| switch (type) { |
| - case content::NOTIFICATION_NAV_ENTRY_COMMITTED: { |
| - // When a navigation happens, we want to hide the keyboard if the focus is |
| - // in the web-page. Otherwise, the keyboard visibility should not change. |
| - NavigationController* controller = |
| - Source<NavigationController>(source).ptr(); |
| - TabContents* tab_contents = controller->tab_contents(); |
| - GetFocusedStateAccessor()->SetProperty(tab_contents->property_bag(), |
| - false); |
| - if (!TabContentsCanAffectKeyboard(tab_contents)) |
| - break; |
| - |
| - TabContentsViewTouch* view = |
| - static_cast<TabContentsViewTouch*>(tab_contents->view()); |
| - views::View* focused = view->GetFocusManager()->GetFocusedView(); |
| - views::TextInputClient* input = |
| - focused ? focused->GetTextInputClient() : NULL; |
| - // Show the keyboard if the focused view supports text-input. |
| - if (input && input->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) |
| - ShowKeyboardForWidget(focused->GetWidget()); |
| - else |
| - Hide(); |
| - break; |
| - } |
| - |
| - case content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE: { |
| - // If the focus in the page moved to an editable field, then the keyboard |
| - // should be visible, otherwise not. |
| - TabContents* tab_contents = Source<TabContents>(source).ptr(); |
| - const bool editable = *Details<const bool>(details).ptr(); |
| - GetFocusedStateAccessor()->SetProperty(tab_contents->property_bag(), |
| - editable); |
| - if (!TabContentsCanAffectKeyboard(tab_contents)) |
| - break; |
| - |
| - if (editable) { |
| - TabContentsViewTouch* view = |
| - static_cast<TabContentsViewTouch*>(tab_contents->view()); |
| - ShowKeyboardForWidget(view->GetWidget()); |
| - } else { |
| - Hide(); |
| - } |
| - |
| - break; |
| - } |
| - |
| - case content::NOTIFICATION_TAB_CONTENTS_DESTROYED: { |
| - // Tab content was destroyed. Forget everything about it. |
| - GetFocusedStateAccessor()->DeleteProperty( |
| - Source<TabContents>(source).ptr()->property_bag()); |
| - break; |
| - } |
| - |
| case chrome::NOTIFICATION_HIDE_KEYBOARD_INVOKED: { |
| - // The keyboard is hiding itself. |
| - Browser* browser = BrowserList::GetLastActive(); |
| - if (browser) { |
| - TabContents* tab_contents = browser->GetSelectedTabContents(); |
| - if (tab_contents) { |
| - GetFocusedStateAccessor()->SetProperty(tab_contents->property_bag(), |
| - false); |
| - } |
| - } |
| - |
| Hide(); |
| break; |
| } |