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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2b14ec631765a41e8712abff255022836ca21c98 |
--- /dev/null |
+++ b/chrome/browser/ui/touch/frame/touch_browser_frame_view.cc |
@@ -0,0 +1,117 @@ |
+// Copyright (c) 2010 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/frame/touch_browser_frame_view.h" |
+ |
+#include <algorithm> |
+ |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/renderer_host/site_instance.h" |
+#include "chrome/browser/tab_contents/tab_contents.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/browser/ui/views/dom_view.h" |
+#include "chrome/browser/ui/views/frame/browser_view.h" |
+#include "chrome/common/notification_service.h" |
+#include "chrome/common/notification_type.h" |
+#include "chrome/common/url_constants.h" |
+#include "gfx/rect.h" |
+ |
+namespace { |
+ |
+const int kKeyboardHeight = 300; |
+ |
+} // namespace |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// TouchBrowserFrameView, public: |
+ |
+TouchBrowserFrameView::TouchBrowserFrameView(BrowserFrame* frame, |
+ BrowserView* browser_view) |
+ : OpaqueBrowserFrameView(frame, browser_view), |
+ keyboard_(NULL) { |
+ registrar_.Add(this, |
+ NotificationType::NAV_ENTRY_COMMITTED, |
+ NotificationService::AllSources()); |
+ registrar_.Add(this, |
+ NotificationType::FOCUS_CHANGED_IN_PAGE, |
+ NotificationService::AllSources()); |
+} |
+ |
+TouchBrowserFrameView::~TouchBrowserFrameView() { |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// TouchBrowserFrameView, protected: |
+int TouchBrowserFrameView::GetReservedHeight() const { |
+ if (keyboard_ && keyboard_->IsVisible()) { |
+ return kKeyboardHeight; |
+ } |
+ return 0; |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// TouchBrowserFrameView, private: |
+ |
+void TouchBrowserFrameView::InitVirtualKeyboard() { |
+ if (keyboard_) |
+ return; |
+ |
+ keyboard_ = new DOMView; |
+ |
+ Profile* keyboard_profile = browser_view()->browser()->profile(); |
+ DCHECK(keyboard_profile) << "Profile required for virtual keyboard."; |
+ |
+ GURL keyboard_url(chrome::kChromeUIKeyboardURL); |
+ keyboard_->Init(keyboard_profile, |
+ SiteInstance::CreateSiteInstanceForURL(keyboard_profile, keyboard_url)); |
+ keyboard_->LoadURL(keyboard_url); |
+ |
+ keyboard_->SetVisible(false); |
+ AddChildView(keyboard_); |
+} |
+ |
+void TouchBrowserFrameView::UpdateKeyboardAndLayout(bool should_show_keyboard) { |
+ if (should_show_keyboard) |
+ InitVirtualKeyboard(); |
+ |
+ // Don't do any extra work until we have shown the keyboard. |
+ if (!keyboard_) |
+ return; |
+ |
+ if (should_show_keyboard == keyboard_->IsVisible()) |
+ return; |
+ |
+ keyboard_->SetVisible(should_show_keyboard); |
+ |
+ // Because the NonClientFrameView is a sibling of the ClientView, |
+ // we rely on the parent to properly resize the ClientView. |
+ GetParent()->Layout(); |
+} |
+ |
+void TouchBrowserFrameView::Observe(NotificationType type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details) { |
+ if (type == NotificationType::FOCUS_CHANGED_IN_PAGE) { |
+ // Only modify the keyboard state if the notification is coming from |
+ // a source within the same Browser. |
+ Browser* browser = browser_view()->browser(); |
+ Source<RenderViewHost> specific_source(source); |
+ for (int i = 0; i < browser->tab_count(); ++i) { |
+ if (browser->GetTabContentsAt(i)->render_view_host() == |
+ specific_source.ptr()) { |
+ UpdateKeyboardAndLayout(*Details<const bool>(details).ptr()); |
+ break; |
+ } |
+ } |
+ } else { |
+ DCHECK(type == NotificationType::NAV_ENTRY_COMMITTED); |
+ |
+ // TODO(bryeung): this is hiding the keyboard for the very first page |
+ // load after browser startup when the page has an input element focused |
+ // to start with. It would be nice to fix, but not critical. |
+ |
+ // Everything else we have registered for should hide the keyboard. |
+ UpdateKeyboardAndLayout(false); |
+ } |
+} |