| Index: chrome/browser/ui/touch/frame/touch_browser_frame_view.cc
|
| diff --git a/chrome/browser/ui/touch/frame/touch_browser_frame_view.cc b/chrome/browser/ui/touch/frame/touch_browser_frame_view.cc
|
| index 50d3367b86c81b92a3b2adb923c7ccce7ead3b33..eb109e7e5dcbe15e0ec79c0a2cc3f69ce28ed3a8 100644
|
| --- a/chrome/browser/ui/touch/frame/touch_browser_frame_view.cc
|
| +++ b/chrome/browser/ui/touch/frame/touch_browser_frame_view.cc
|
| @@ -6,16 +6,11 @@
|
|
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/renderer_host/render_widget_host_view_views.h"
|
| -#include "chrome/browser/tabs/tab_strip_model.h"
|
| #include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
|
| #include "chrome/browser/ui/touch/frame/keyboard_container_view.h"
|
| #include "chrome/browser/ui/views/frame/browser_view.h"
|
| -#include "chrome/browser/ui/views/tab_contents/tab_contents_view_touch.h"
|
| #include "content/browser/renderer_host/render_view_host.h"
|
| -#include "content/browser/tab_contents/navigation_controller.h"
|
| #include "content/browser/tab_contents/tab_contents.h"
|
| -#include "content/browser/tab_contents/tab_contents_view.h"
|
| #include "content/common/notification_service.h"
|
| #include "content/common/notification_type.h"
|
| #include "content/common/view_messages.h"
|
| @@ -23,8 +18,6 @@
|
| #include "ui/gfx/rect.h"
|
| #include "ui/gfx/transform.h"
|
| #include "views/controls/button/image_button.h"
|
| -#include "views/controls/textfield/textfield.h"
|
| -#include "views/focus/focus_manager.h"
|
|
|
| #if defined(OS_CHROMEOS)
|
| #include "chrome/browser/chromeos/cros/cros_library.h"
|
| @@ -36,16 +29,6 @@ namespace {
|
| const int kDefaultKeyboardHeight = 300;
|
| const int kKeyboardSlideDuration = 300; // In milliseconds
|
|
|
| -PropertyAccessor<bool>* GetFocusedStateAccessor() {
|
| - static PropertyAccessor<bool> state;
|
| - return &state;
|
| -}
|
| -
|
| -bool TabContentsHasFocus(const TabContents* contents) {
|
| - views::View* view = static_cast<TabContentsViewTouch*>(contents->view());
|
| - return view->Contains(view->GetFocusManager()->GetFocusedView());
|
| -}
|
| -
|
| } // namespace
|
|
|
| // static
|
| @@ -63,23 +46,12 @@ TouchBrowserFrameView::TouchBrowserFrameView(BrowserFrame* frame,
|
| focus_listener_added_(false),
|
| keyboard_(NULL) {
|
| registrar_.Add(this,
|
| - NotificationType::NAV_ENTRY_COMMITTED,
|
| - NotificationService::AllSources());
|
| - registrar_.Add(this,
|
| - NotificationType::FOCUS_CHANGED_IN_PAGE,
|
| - NotificationService::AllSources());
|
| - registrar_.Add(this,
|
| - NotificationType::TAB_CONTENTS_DESTROYED,
|
| - NotificationService::AllSources());
|
| - registrar_.Add(this,
|
| NotificationType::HIDE_KEYBOARD_INVOKED,
|
| NotificationService::AllSources());
|
| registrar_.Add(this,
|
| NotificationType::SET_KEYBOARD_HEIGHT_INVOKED,
|
| NotificationService::AllSources());
|
|
|
| - browser_view->browser()->tabstrip_model()->AddObserver(this);
|
| -
|
| animation_.reset(new ui::SlideAnimation(this));
|
| animation_->SetTweenType(ui::Tween::LINEAR);
|
| animation_->SetSlideDuration(kKeyboardSlideDuration);
|
| @@ -92,7 +64,6 @@ TouchBrowserFrameView::TouchBrowserFrameView(BrowserFrame* frame,
|
| }
|
|
|
| TouchBrowserFrameView::~TouchBrowserFrameView() {
|
| - browser_view()->browser()->tabstrip_model()->RemoveObserver(this);
|
| }
|
|
|
| std::string TouchBrowserFrameView::GetClassName() const {
|
| @@ -118,16 +89,6 @@ void TouchBrowserFrameView::Layout() {
|
| keyboard_->SetBoundsRect(bounds);
|
| }
|
|
|
| -void TouchBrowserFrameView::FocusWillChange(views::View* focused_before,
|
| - views::View* focused_now) {
|
| - VirtualKeyboardType before = DecideKeyboardStateForView(focused_before);
|
| - VirtualKeyboardType now = DecideKeyboardStateForView(focused_now);
|
| - if (before != now) {
|
| - // TODO(varunjain): support other types of keyboard.
|
| - UpdateKeyboardAndLayout(now == GENERIC);
|
| - }
|
| -}
|
| -
|
| ///////////////////////////////////////////////////////////////////////////////
|
| // TouchBrowserFrameView, protected:
|
|
|
| @@ -139,17 +100,20 @@ void TouchBrowserFrameView::ViewHierarchyChanged(bool is_add,
|
| View* parent,
|
| View* child) {
|
| OpaqueBrowserFrameView::ViewHierarchyChanged(is_add, parent, child);
|
| - if (!GetFocusManager())
|
| + views::InputMethod* input_method = GetInputMethod();
|
| + if (!input_method)
|
| return;
|
|
|
| if (is_add && !focus_listener_added_) {
|
| // Add focus listener when this view is added to the hierarchy.
|
| - GetFocusManager()->AddFocusChangeListener(this);
|
| + input_method->AddTextInputTypeChangedListener(this);
|
| focus_listener_added_ = true;
|
| + UpdateKeyboard(input_method->GetTextInputType());
|
| } else if (!is_add && focus_listener_added_) {
|
| // Remove focus listener when this view is removed from the hierarchy.
|
| - GetFocusManager()->RemoveFocusChangeListener(this);
|
| + input_method->RemoveTextInputTypeChangedListener(this);
|
| focus_listener_added_ = false;
|
| + UpdateKeyboardAndLayout(false);
|
| }
|
| }
|
|
|
| @@ -169,6 +133,20 @@ void TouchBrowserFrameView::InitVirtualKeyboard() {
|
| AddChildView(keyboard_);
|
| }
|
|
|
| +void TouchBrowserFrameView::UpdateKeyboard(ui::TextInputType type) {
|
| + switch (type) {
|
| + case ui::TEXT_INPUT_TYPE_NONE:
|
| + UpdateKeyboardAndLayout(false);
|
| + return;
|
| + case ui::TEXT_INPUT_TYPE_TEXT:
|
| + case ui::TEXT_INPUT_TYPE_PASSWORD:
|
| + default:
|
| + // TODO(penghuang): pass the input type to virtual keyboard.
|
| + UpdateKeyboardAndLayout(true);
|
| + return;
|
| + }
|
| +}
|
| +
|
| void TouchBrowserFrameView::UpdateKeyboardAndLayout(bool should_show_keyboard) {
|
| if (should_show_keyboard)
|
| InitVirtualKeyboard();
|
| @@ -199,24 +177,6 @@ void TouchBrowserFrameView::UpdateKeyboardAndLayout(bool should_show_keyboard) {
|
| }
|
| }
|
|
|
| -TouchBrowserFrameView::VirtualKeyboardType
|
| - TouchBrowserFrameView::DecideKeyboardStateForView(views::View* view) {
|
| - if (!view)
|
| - return NONE;
|
| -
|
| - std::string cname = view->GetClassName();
|
| - if (cname == views::Textfield::kViewClassName) {
|
| - return GENERIC;
|
| - } else if (cname == RenderWidgetHostViewViews::kViewClassName) {
|
| - TabContents* contents = browser_view()->browser()->GetSelectedTabContents();
|
| - bool* editable = contents ? GetFocusedStateAccessor()->GetProperty(
|
| - contents->property_bag()) : NULL;
|
| - if (editable && *editable)
|
| - return GENERIC;
|
| - }
|
| - return NONE;
|
| -}
|
| -
|
| bool TouchBrowserFrameView::HitTest(const gfx::Point& point) const {
|
| if (OpaqueBrowserFrameView::HitTest(point))
|
| return true;
|
| @@ -237,93 +197,29 @@ bool TouchBrowserFrameView::HitTest(const gfx::Point& point) const {
|
| return false;
|
| }
|
|
|
| -void TouchBrowserFrameView::ActiveTabChanged(TabContentsWrapper* old_contents,
|
| - TabContentsWrapper* new_contents,
|
| - int index,
|
| - bool user_gesture) {
|
| - if (new_contents == old_contents)
|
| - return;
|
| -
|
| - TabContents* contents = new_contents->tab_contents();
|
| - if (!TabContentsHasFocus(contents))
|
| - return;
|
| -
|
| - bool* editable = GetFocusedStateAccessor()->GetProperty(
|
| - contents->property_bag());
|
| - UpdateKeyboardAndLayout(editable ? *editable : false);
|
| -}
|
| -
|
| -void TouchBrowserFrameView::TabStripEmpty() {
|
| - if (animation_->is_animating()) {
|
| - // Reset the delegate so the AnimationEnded callback doesn't trigger.
|
| - animation_->set_delegate(NULL);
|
| - animation_->Stop();
|
| - }
|
| -}
|
| -
|
| void TouchBrowserFrameView::Observe(NotificationType type,
|
| const NotificationSource& source,
|
| const NotificationDetails& details) {
|
| - Browser* browser = browser_view()->browser();
|
| - if (type == NotificationType::FOCUS_CHANGED_IN_PAGE) {
|
| - // Only modify the keyboard state if the currently active tab sent the
|
| - // notification.
|
| - const TabContents* current_tab = browser->GetSelectedTabContents();
|
| - TabContents* source_tab = Source<TabContents>(source).ptr();
|
| - const bool editable = *Details<const bool>(details).ptr();
|
| -
|
| - if (current_tab == source_tab && TabContentsHasFocus(source_tab))
|
| - UpdateKeyboardAndLayout(editable);
|
| -
|
| - // Save the state of the focused field so that the keyboard visibility
|
| - // can be determined after tab switching.
|
| - GetFocusedStateAccessor()->SetProperty(
|
| - source_tab->property_bag(), editable);
|
| - } else if (type == NotificationType::NAV_ENTRY_COMMITTED) {
|
| - NavigationController* controller =
|
| - Source<NavigationController>(source).ptr();
|
| - Browser* source_browser = Browser::GetBrowserForController(
|
| - controller, NULL);
|
| -
|
| - // If the Browser for the keyboard has navigated, re-evaluate the visibility
|
| - // of the keyboard.
|
| - TouchBrowserFrameView::VirtualKeyboardType keyboard_type = NONE;
|
| - views::View* view = GetFocusManager()->GetFocusedView();
|
| - if (view) {
|
| - if (view->GetClassName() == views::Textfield::kViewClassName)
|
| - keyboard_type = GENERIC;
|
| - if (view->GetClassName() == RenderWidgetHostViewViews::kViewClassName) {
|
| - // Reset the state of the focused field in the current tab.
|
| - GetFocusedStateAccessor()->SetProperty(
|
| - controller->tab_contents()->property_bag(), false);
|
| + switch (type.value) {
|
| + case NotificationType::HIDE_KEYBOARD_INVOKED:
|
| + UpdateKeyboardAndLayout(false);
|
| + return;
|
| + case NotificationType::SET_KEYBOARD_HEIGHT_INVOKED: {
|
| + // TODO(penghuang) Allow extension conrtol the virtual keyboard directly
|
| + // instead of using Notification.
|
| + int height = *reinterpret_cast<int*>(details.map_key());
|
| + if (height != keyboard_height_) {
|
| + DCHECK_GE(height, 0) << "Height of the keyboard is less than 0.";
|
| + DCHECK_LE(height, View::height()) << "Height of the keyboard is greater"
|
| + " than the height of frame view.";
|
| + keyboard_height_ = height;
|
| + parent()->Layout();
|
| }
|
| + return;
|
| }
|
| - if (source_browser == browser)
|
| - UpdateKeyboardAndLayout(keyboard_type == GENERIC);
|
| - } else if (type == NotificationType::TAB_CONTENTS_DESTROYED) {
|
| - GetFocusedStateAccessor()->DeleteProperty(
|
| - Source<TabContents>(source).ptr()->property_bag());
|
| - } else if (type == NotificationType::PREF_CHANGED) {
|
| - OpaqueBrowserFrameView::Observe(type, source, details);
|
| - } else if (type == NotificationType::HIDE_KEYBOARD_INVOKED) {
|
| - TabContents* tab_contents =
|
| - browser_view()->browser()->GetSelectedTabContents();
|
| - if (tab_contents) {
|
| - GetFocusedStateAccessor()->SetProperty(tab_contents->property_bag(),
|
| - false);
|
| - }
|
| - UpdateKeyboardAndLayout(false);
|
| - } else if (type == NotificationType::SET_KEYBOARD_HEIGHT_INVOKED) {
|
| - // TODO(penghuang) Allow extension conrtol the virtual keyboard directly
|
| - // instead of using Notification.
|
| - int height = *reinterpret_cast<int*>(details.map_key());
|
| - if (height != keyboard_height_) {
|
| - DCHECK_GE(height, 0) << "Height of the keyboard is less than 0.";
|
| - DCHECK_LE(height, View::height()) << "Height of the keyboard is greater "
|
| - "than the height of frame view.";
|
| - keyboard_height_ = height;
|
| - parent()->Layout();
|
| - }
|
| + default:
|
| + OpaqueBrowserFrameView::Observe(type, source, details);
|
| + return;
|
| }
|
| }
|
|
|
| @@ -372,3 +268,10 @@ void TouchBrowserFrameView::VirtualKeyboardChanged(
|
| VLOG(1) << "VirtualKeyboardChanged: Switched to " << url.spec();
|
| }
|
| #endif
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +// views::TextInputTypeChangedListener implementation
|
| +void TouchBrowserFrameView::TextInputTypeChanged(
|
| + views::View* view, ui::TextInputType type) {
|
| + UpdateKeyboard(type);
|
| +}
|
|
|