| 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
|
| deleted file mode 100644
|
| index dec1dd4d8f4ff06a71399787427ea25af377f1ab..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/touch/keyboard/keyboard_manager.cc
|
| +++ /dev/null
|
| @@ -1,491 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#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/extensions/extension_function_dispatcher.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/profiles/profile_manager.h"
|
| -#include "chrome/browser/tabs/tab_strip_model.h"
|
| -#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
|
| -#include "chrome/browser/ui/views/dom_view.h"
|
| -#include "chrome/common/chrome_notification_types.h"
|
| -#include "chrome/common/extensions/extension_messages.h"
|
| -#include "chrome/common/url_constants.h"
|
| -#include "content/browser/site_instance.h"
|
| -#include "content/browser/tab_contents/tab_contents_observer.h"
|
| -#include "content/common/notification_service.h"
|
| -#include "ui/base/animation/animation_delegate.h"
|
| -#include "ui/base/animation/slide_animation.h"
|
| -#include "ui/base/ime/text_input_type.h"
|
| -#include "ui/gfx/compositor/layer.h"
|
| -#include "ui/gfx/interpolated_transform.h"
|
| -#include "ui/gfx/screen.h"
|
| -#include "views/ime/text_input_type_tracker.h"
|
| -#include "views/widget/widget.h"
|
| -
|
| -#if defined(OS_CHROMEOS)
|
| -#include "chrome/browser/chromeos/input_method/input_method_manager.h"
|
| -#include "chrome/browser/chromeos/input_method/virtual_keyboard_selector.h"
|
| -#endif
|
| -
|
| -namespace {
|
| -
|
| -const int kDefaultKeyboardHeight = 300;
|
| -const int kKeyboardSlideDuration = 300; // In milliseconds
|
| -const char kOnTextInputTypeChanged[] =
|
| - "experimental.input.onTextInputTypeChanged";
|
| -
|
| -// The default position of the keyboard widget should be at the bottom,
|
| -// spanning the entire width of the desktop.
|
| -gfx::Rect GetKeyboardPosition(int height) {
|
| - views::View* desktop = views::desktop::DesktopWindowView::desktop_window_view;
|
| - gfx::Rect area;
|
| - if (desktop)
|
| - area = desktop->bounds();
|
| - else
|
| - area = gfx::Screen::GetMonitorAreaNearestPoint(gfx::Point());
|
| - return gfx::Rect(area.x(), area.y() + area.height() - height,
|
| - area.width(), height);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// TODO(sad): Is the default profile always going to be the one we want?
|
| -
|
| -class KeyboardWidget
|
| - : public views::Widget,
|
| - public ui::AnimationDelegate,
|
| - public TabContentsObserver,
|
| - public ExtensionFunctionDispatcher::Delegate,
|
| -#if defined(OS_CHROMEOS)
|
| - public chromeos::input_method::InputMethodManager::VirtualKeyboardObserver,
|
| -#endif
|
| - public NotificationObserver,
|
| - public views::Widget::Observer,
|
| - public views::TextInputTypeObserver {
|
| - public:
|
| - KeyboardWidget();
|
| - virtual ~KeyboardWidget();
|
| -
|
| - // Show the keyboard for the target widget. The events from the keyboard will
|
| - // be sent to |widget|.
|
| - // TODO(sad): Allow specifying the type of keyboard to show.
|
| - void ShowKeyboardForWidget(views::Widget* widget);
|
| -
|
| - // Updates the bounds to reflect the current screen/desktop bounds.
|
| - void ResetBounds();
|
| -
|
| - // Overridden from views::Widget
|
| - void Hide() OVERRIDE;
|
| -
|
| - private:
|
| - // Sets the target widget, adds/removes Widget::Observer, reparents etc.
|
| - void SetTarget(Widget* target);
|
| -
|
| - // Overridden from views::Widget.
|
| - virtual bool OnKeyEvent(const views::KeyEvent& event) OVERRIDE;
|
| -
|
| - // Overridden from ui::AnimationDelegate.
|
| - virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE;
|
| - virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE;
|
| -
|
| - // Overridden from TabContentsObserver.
|
| - virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
|
| - void OnRequest(const ExtensionHostMsg_Request_Params& params);
|
| -
|
| - // Overridden from TextInputTypeObserver.
|
| - virtual void TextInputTypeChanged(ui::TextInputType type,
|
| - views::Widget *widget) OVERRIDE;
|
| -
|
| - // Overridden from ExtensionFunctionDispatcher::Delegate.
|
| - virtual Browser* GetBrowser() OVERRIDE;
|
| - virtual gfx::NativeView GetNativeViewOfHost() OVERRIDE;
|
| - virtual TabContents* GetAssociatedTabContents() const OVERRIDE;
|
| -
|
| -#if defined(OS_CHROMEOS)
|
| - // Overridden from input_method::InputMethodManager::VirtualKeyboardObserver.
|
| - virtual void VirtualKeyboardChanged(
|
| - chromeos::input_method::InputMethodManager* manager,
|
| - const chromeos::input_method::VirtualKeyboard& virtual_keyboard,
|
| - const std::string& virtual_keyboard_layout);
|
| -#endif
|
| -
|
| - // Overridden from NotificationObserver.
|
| - virtual void Observe(int type,
|
| - const NotificationSource& source,
|
| - const NotificationDetails& details) OVERRIDE;
|
| -
|
| - // Overridden from views::Widget::Observer.
|
| - virtual void OnWidgetClosing(Widget* widget) OVERRIDE;
|
| - virtual void OnWidgetVisibilityChanged(Widget* widget, bool visible) OVERRIDE;
|
| - virtual void OnWidgetActivationChanged(Widget* widget, bool active) OVERRIDE;
|
| -
|
| - // The animation.
|
| - scoped_ptr<ui::SlideAnimation> animation_;
|
| -
|
| - // Interpolated transform used during animation.
|
| - scoped_ptr<ui::InterpolatedTransform> transform_;
|
| -
|
| - // The DOM view to host the keyboard.
|
| - DOMView* dom_view_;
|
| -
|
| - ExtensionFunctionDispatcher extension_dispatcher_;
|
| -
|
| - // The widget the events from the keyboard should be directed to.
|
| - views::Widget* target_;
|
| -
|
| - // Height of the keyboard.
|
| - int keyboard_height_;
|
| -
|
| - NotificationRegistrar registrar_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(KeyboardWidget);
|
| -};
|
| -
|
| -KeyboardWidget::KeyboardWidget()
|
| - : views::Widget::Widget(),
|
| - dom_view_(new DOMView),
|
| - ALLOW_THIS_IN_INITIALIZER_LIST(
|
| - extension_dispatcher_(ProfileManager::GetDefaultProfile(), this)),
|
| - target_(NULL),
|
| - keyboard_height_(kDefaultKeyboardHeight) {
|
| -
|
| - // Initialize the widget first.
|
| - views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
|
| - params.keep_on_top = true;
|
| - params.transparent = true;
|
| - params.bounds = GetKeyboardPosition(keyboard_height_);
|
| - Init(params);
|
| -
|
| - // Setup the DOM view to host the keyboard.
|
| - Profile* profile = ProfileManager::GetDefaultProfile();
|
| - GURL keyboard_url(chrome::kChromeUIKeyboardURL);
|
| - dom_view_->Init(profile,
|
| - SiteInstance::CreateSiteInstanceForURL(profile, keyboard_url));
|
| - dom_view_->LoadURL(keyboard_url);
|
| - dom_view_->SetVisible(true);
|
| - SetContentsView(dom_view_);
|
| -
|
| - // Setup observer so the events from the keyboard can be handled.
|
| - TabContentsObserver::Observe(dom_view_->tab_contents());
|
| -
|
| - // Initialize the animation.
|
| - animation_.reset(new ui::SlideAnimation(this));
|
| - animation_->SetTweenType(ui::Tween::LINEAR);
|
| - animation_->SetSlideDuration(kKeyboardSlideDuration);
|
| -
|
| - views::TextInputTypeTracker::GetInstance()->AddTextInputTypeObserver(this);
|
| - registrar_.Add(this,
|
| - chrome::NOTIFICATION_HIDE_KEYBOARD_INVOKED,
|
| - NotificationService::AllSources());
|
| - registrar_.Add(this,
|
| - chrome::NOTIFICATION_SET_KEYBOARD_HEIGHT_INVOKED,
|
| - NotificationService::AllSources());
|
| - registrar_.Add(this,
|
| - content::NOTIFICATION_APP_TERMINATING,
|
| - NotificationService::AllSources());
|
| -
|
| -#if defined(OS_CHROMEOS)
|
| - chromeos::input_method::InputMethodManager* manager =
|
| - chromeos::input_method::InputMethodManager::GetInstance();
|
| - manager->AddVirtualKeyboardObserver(this);
|
| -#endif
|
| -}
|
| -
|
| -KeyboardWidget::~KeyboardWidget() {
|
| - if (target_)
|
| - target_->RemoveObserver(this);
|
| - views::TextInputTypeTracker::GetInstance()->RemoveTextInputTypeObserver(this);
|
| -#if defined(OS_CHROMEOS)
|
| - chromeos::input_method::InputMethodManager* manager =
|
| - chromeos::input_method::InputMethodManager::GetInstance();
|
| - manager->RemoveVirtualKeyboardObserver(this);
|
| -#endif
|
| -
|
| - // TODO(sad): Do anything else?
|
| -}
|
| -
|
| -void KeyboardWidget::ShowKeyboardForWidget(views::Widget* widget) {
|
| - SetTarget(widget);
|
| -
|
| - transform_.reset(new ui::InterpolatedTranslation(
|
| - gfx::Point(0, keyboard_height_), gfx::Point()));
|
| -
|
| - GetRootView()->SetTransform(
|
| - transform_->Interpolate(animation_->GetCurrentValue()));
|
| - animation_->Show();
|
| -
|
| - Show();
|
| -
|
| - bool visible = true;
|
| - NotificationService::current()->Notify(
|
| - chrome::NOTIFICATION_KEYBOARD_VISIBILITY_CHANGED,
|
| - Source<KeyboardWidget>(this),
|
| - Details<bool>(&visible));
|
| -}
|
| -
|
| -void KeyboardWidget::ResetBounds() {
|
| - SetBounds(GetKeyboardPosition(keyboard_height_));
|
| -}
|
| -
|
| -void KeyboardWidget::Hide() {
|
| - animation_->Hide();
|
| -
|
| - bool visible = false;
|
| - NotificationService::current()->Notify(
|
| - chrome::NOTIFICATION_KEYBOARD_VISIBILITY_CHANGED,
|
| - Source<KeyboardWidget>(this),
|
| - Details<bool>(&visible));
|
| -}
|
| -
|
| -void KeyboardWidget::SetTarget(views::Widget* target) {
|
| - if (target_)
|
| - target_->RemoveObserver(this);
|
| -
|
| - target_ = target;
|
| -
|
| - if (target_) {
|
| - // TODO(sad): Make |target_| the parent widget.
|
| - target_->AddObserver(this);
|
| - } else if (IsVisible()) {
|
| - Hide();
|
| - }
|
| -}
|
| -
|
| -bool KeyboardWidget::OnKeyEvent(const views::KeyEvent& event) {
|
| - return target_ ? target_->OnKeyEvent(event) : false;
|
| -}
|
| -
|
| -void KeyboardWidget::AnimationProgressed(const ui::Animation* animation) {
|
| - float t = static_cast<float>(animation_->GetCurrentValue());
|
| - if (GetRootView()->layer())
|
| - GetRootView()->layer()->SetOpacity(t * t);
|
| - GetRootView()->SetTransform(transform_->Interpolate(t));
|
| -}
|
| -
|
| -void KeyboardWidget::AnimationEnded(const ui::Animation* animation) {
|
| - gfx::Rect keyboard_rect;
|
| - if (animation_->GetCurrentValue() < 0.01)
|
| - Widget::Hide();
|
| - else
|
| - keyboard_rect = GetWindowScreenBounds();
|
| -
|
| - NotificationService::current()->Notify(
|
| - chrome::NOTIFICATION_KEYBOARD_VISIBLE_BOUNDS_CHANGED,
|
| - Source<KeyboardWidget>(this),
|
| - Details<gfx::Rect>(&keyboard_rect));
|
| -}
|
| -
|
| -bool KeyboardWidget::OnMessageReceived(const IPC::Message& message) {
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(KeyboardWidget, message)
|
| - IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest)
|
| - IPC_MESSAGE_UNHANDLED(handled = false)
|
| - IPC_END_MESSAGE_MAP()
|
| - return handled;
|
| -}
|
| -
|
| -void KeyboardWidget::OnRequest(const ExtensionHostMsg_Request_Params& request) {
|
| - extension_dispatcher_.Dispatch(request,
|
| - dom_view_->tab_contents()->render_view_host());
|
| -}
|
| -
|
| -void KeyboardWidget::TextInputTypeChanged(ui::TextInputType type,
|
| - views::Widget *widget) {
|
| - // Send onTextInputTypeChanged event to keyboard extension.
|
| - ListValue args;
|
| - switch (type) {
|
| - case ui::TEXT_INPUT_TYPE_NONE: {
|
| - 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: {
|
| - NOTREACHED();
|
| - 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());
|
| -
|
| - if (type == ui::TEXT_INPUT_TYPE_NONE)
|
| - Hide();
|
| - else
|
| - ShowKeyboardForWidget(widget);
|
| -}
|
| -
|
| -Browser* KeyboardWidget::GetBrowser() {
|
| - // TODO(sad): Find a better way. Perhaps just return NULL, and fix
|
| - // SendKeyboardEventInputFunction::GetTopLevelWidget to somehow interact with
|
| - // the WM to find the top level widget?
|
| - return BrowserList::GetLastActive();
|
| -}
|
| -
|
| -gfx::NativeView KeyboardWidget::GetNativeViewOfHost() {
|
| - return dom_view_->native_view();
|
| -}
|
| -
|
| -TabContents* KeyboardWidget::GetAssociatedTabContents() const {
|
| - return dom_view_->tab_contents();
|
| -}
|
| -
|
| -#if defined(OS_CHROMEOS)
|
| -void KeyboardWidget::VirtualKeyboardChanged(
|
| - chromeos::input_method::InputMethodManager* manager,
|
| - const chromeos::input_method::VirtualKeyboard& virtual_keyboard,
|
| - const std::string& virtual_keyboard_layout) {
|
| - const GURL& url = virtual_keyboard.GetURLForLayout(virtual_keyboard_layout);
|
| - dom_view_->LoadURL(url);
|
| - VLOG(1) << "VirtualKeyboardChanged: Switched to " << url.spec();
|
| -}
|
| -#endif
|
| -
|
| -void KeyboardWidget::Observe(int type,
|
| - const NotificationSource& source,
|
| - const NotificationDetails& details) {
|
| - switch (type) {
|
| - case chrome::NOTIFICATION_HIDE_KEYBOARD_INVOKED: {
|
| - Hide();
|
| - break;
|
| - }
|
| -
|
| - case chrome::NOTIFICATION_SET_KEYBOARD_HEIGHT_INVOKED: {
|
| - // The keyboard is resizing itself.
|
| -
|
| - // TODO(penghuang) Allow extension conrtol the virtual keyboard directly
|
| - // instead of using Notification.
|
| - int height = *Details<int>(details).ptr();
|
| - if (height != keyboard_height_) {
|
| - DCHECK_GE(height, 0) << "Keyboard height should not be negative.";
|
| -
|
| - int old_height = keyboard_height_;
|
| - keyboard_height_ = height;
|
| - gfx::Rect rect = GetWindowScreenBounds();
|
| - rect.set_y(rect.y() + old_height - keyboard_height_);
|
| - rect.set_height(keyboard_height_);
|
| - SetBounds(rect);
|
| -
|
| - // TODO(sad): Notify the target widget that the size has changed so it
|
| - // can update its display accordingly if it wanted to.
|
| - }
|
| - break;
|
| - }
|
| -
|
| - case content::NOTIFICATION_APP_TERMINATING: {
|
| - CloseNow();
|
| - break;
|
| - }
|
| -
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| -}
|
| -
|
| -void KeyboardWidget::OnWidgetClosing(Widget* widget) {
|
| - if (target_ == widget)
|
| - SetTarget(NULL);
|
| -}
|
| -
|
| -void KeyboardWidget::OnWidgetVisibilityChanged(Widget* widget, bool visible) {
|
| - if (target_ == widget && !visible)
|
| - SetTarget(NULL);
|
| -}
|
| -
|
| -void KeyboardWidget::OnWidgetActivationChanged(Widget* widget, bool active) {
|
| - if (target_ == widget && !active)
|
| - SetTarget(NULL);
|
| -}
|
| -
|
| -KeyboardManager::KeyboardManager()
|
| - : keyboard_(new KeyboardWidget()) {
|
| - keyboard_->AddObserver(this);
|
| -
|
| - views::desktop::DesktopWindowView* desktop =
|
| - views::desktop::DesktopWindowView::desktop_window_view;
|
| -
|
| - // We are either not in views desktop mode, or we are and we are not yet
|
| - // observing the desktop.
|
| - DCHECK(!desktop || !desktop->HasObserver(this));
|
| -
|
| - if (desktop)
|
| - desktop->AddObserver(this);
|
| -}
|
| -
|
| -KeyboardManager::~KeyboardManager() {
|
| - DCHECK(!keyboard_);
|
| -
|
| - views::desktop::DesktopWindowView* desktop =
|
| - views::desktop::DesktopWindowView::desktop_window_view;
|
| -
|
| - // We are either not in views desktop mode, or we are and we have been
|
| - // observing the desktop
|
| - DCHECK(!desktop || desktop->HasObserver(this));
|
| -
|
| - if (desktop)
|
| - desktop->RemoveObserver(this);
|
| -}
|
| -
|
| -void KeyboardManager::ShowKeyboardForWidget(views::Widget* widget) {
|
| - keyboard_->ShowKeyboardForWidget(widget);
|
| -}
|
| -
|
| -void KeyboardManager::Hide() {
|
| - keyboard_->Hide();
|
| -}
|
| -
|
| -views::Widget* KeyboardManager::keyboard() {
|
| - return keyboard_;
|
| -}
|
| -
|
| -void KeyboardManager::OnWidgetClosing(views::Widget* widget) {
|
| - DCHECK_EQ(keyboard_, widget);
|
| - keyboard_ = NULL;
|
| -}
|
| -
|
| -void KeyboardManager::OnDesktopBoundsChanged(const gfx::Rect& prev_bounds) {
|
| - keyboard_->ResetBounds();
|
| -}
|
| -
|
| -// static
|
| -KeyboardManager* KeyboardManager::GetInstance() {
|
| - return Singleton<KeyboardManager>::get();
|
| -}
|
|
|