1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/webui_login_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/debug/trace_event.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/accessibility/accessibility_util.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/proxy_settings_dialog.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/webui_login_display.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h"
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/media/media_capture_devices_dispatcher.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/media/media_stream_infobar_delegate.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/password_manager/chrome_password_manager_client.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_preferences_util.h"
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/sessions/session_tab_helper.h"
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/ui/autofill/chrome_autofill_client.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/session_manager_client.h"
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_state.h"
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_state_handler.h"
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/password_manager/core/browser/password_manager.h"
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_manager.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/render_frame_host.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/webview/webview.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NativeWebKeyboardEvent;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using web_modal::WebContentsModalDialogManager;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// These strings must be kept in sync with handleAccelerator()
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// in display_manager.js.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAccelNameCancel[] = "cancel";
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAccelNameEnrollment[] = "enrollment";
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char kAccelNameKioskEnable[] = "kiosk_enable";
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAccelNameVersion[] = "version";
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAccelNameReset[] = "reset";
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kAccelFocusPrev[] = "focus_prev";
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kAccelFocusNext[] = "focus_next";
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kAccelNameDeviceRequisition[] = "device_requisition";
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kAccelNameDeviceRequisitionRemora[] = "device_requisition_remora";
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kAccelNameDeviceRequisitionShark[] = "device_requisition_shark";
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kAccelNameAppLaunchBailout[] = "app_launch_bailout";
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kAccelNameAppLaunchNetworkConfig[] = "app_launch_network_config";
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kAccelNameShowRollbackOption[] = "show_rollback_on_reset_screen";
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kAccelNameHideRollbackOption[] = "hide_rollback_on_reset_screen";
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A class to change arrow key traversal behavior when it's alive.
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ScopedArrowKeyTraversal {
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit ScopedArrowKeyTraversal(bool new_arrow_key_tranversal_enabled)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : previous_arrow_key_traversal_enabled_(
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            views::FocusManager::arrow_key_traversal_enabled()) {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    views::FocusManager::set_arrow_key_traversal_enabled(
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new_arrow_key_tranversal_enabled);
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ~ScopedArrowKeyTraversal() {
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    views::FocusManager::set_arrow_key_traversal_enabled(
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        previous_arrow_key_traversal_enabled_);
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const bool previous_arrow_key_traversal_enabled_;
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedArrowKeyTraversal);
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char WebUILoginView::kViewClassName[] =
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "browser/chromeos/login/WebUILoginView";
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebUILoginView public: ------------------------------------------------------
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUILoginView::WebUILoginView()
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : webui_login_(NULL),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_hidden_(false),
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      webui_visible_(false),
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      should_emit_login_prompt_visible_(true),
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      forward_keyboard_event_(true) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this,
108a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch                 chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllSources());
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  registrar_.Add(this,
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN,
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 content::NotificationService::AllSources());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accel_map_[ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)] =
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAccelNameCancel;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accel_map_[ui::Accelerator(ui::VKEY_E,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)] =
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAccelNameEnrollment;
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  accel_map_[ui::Accelerator(ui::VKEY_K,
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)] =
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kAccelNameKioskEnable;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accel_map_[ui::Accelerator(ui::VKEY_V, ui::EF_ALT_DOWN)] =
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAccelNameVersion;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  accel_map_[ui::Accelerator(ui::VKEY_R,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN)] =
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAccelNameReset;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  accel_map_[ui::Accelerator(ui::VKEY_LEFT, ui::EF_NONE)] =
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kAccelFocusPrev;
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  accel_map_[ui::Accelerator(ui::VKEY_RIGHT, ui::EF_NONE)] =
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kAccelFocusNext;
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Use KEY_RELEASED because Gaia consumes KEY_PRESSED for up/down key.
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::Accelerator key_up(ui::VKEY_UP, ui::EF_NONE);
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  key_up.set_type(ui::ET_KEY_RELEASED);
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::Accelerator key_down(ui::VKEY_DOWN, ui::EF_NONE);
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  key_down.set_type(ui::ET_KEY_RELEASED);
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  accel_map_[key_up] = kAccelFocusPrev;
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  accel_map_[key_down] = kAccelFocusNext;
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  accel_map_[ui::Accelerator(
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ui::VKEY_D, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN)] =
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      kAccelNameDeviceRequisition;
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  accel_map_[
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ui::Accelerator(ui::VKEY_H, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)] =
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      kAccelNameDeviceRequisitionRemora;
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  accel_map_[
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui::Accelerator(ui::VKEY_H,
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN)] =
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kAccelNameDeviceRequisitionShark;
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  accel_map_[ui::Accelerator(ui::VKEY_S,
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)] =
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      kAccelNameAppLaunchBailout;
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  accel_map_[ui::Accelerator(ui::VKEY_N,
157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                             ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)] =
158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      kAccelNameAppLaunchNetworkConfig;
159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::Accelerator show_rollback(ui::VKEY_MENU, ui::EF_ALT_DOWN);
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  show_rollback.set_type(ui::ET_KEY_PRESSED);
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  accel_map_[show_rollback] = kAccelNameShowRollbackOption;
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::Accelerator hide_rollback(ui::VKEY_MENU, ui::EF_NONE);
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  hide_rollback.set_type(ui::ET_KEY_RELEASED);
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  accel_map_[hide_rollback] = kAccelNameHideRollbackOption;
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (AccelMap::iterator i(accel_map_.begin()); i != accel_map_.end(); ++i)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddAccelerator(i->first);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUILoginView::~WebUILoginView() {
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FOR_EACH_OBSERVER(web_modal::ModalDialogHostObserver,
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    observer_list_,
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    OnHostDestroying());
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ash::Shell::GetInstance()->HasPrimaryStatusArea()) {
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::Shell::GetInstance()->GetPrimarySystemTray()->
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SetNextFocusableView(NULL);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void WebUILoginView::Init() {
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Profile* signin_profile = ProfileHelper::GetSigninProfile();
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  auth_extension_.reset(new ScopedGaiaAuthExtension(signin_profile));
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  webui_login_ = new views::WebView(signin_profile);
1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  webui_login_->set_allow_accelerators(true);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(webui_login_);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents = webui_login_->GetWebContents();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Ensure that the login UI has a tab ID, which will allow the GAIA auth
1955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // extension's background script to tell it apart from a captive portal window
1965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // that may be opened on top of this UI.
1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SessionTabHelper::CreateForWebContents(web_contents);
1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create the password manager that is needed for the proxy.
200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ChromePasswordManagerClient::CreateForWebContentsWithAutofillClient(
2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      web_contents,
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      autofill::ChromeAutofillClient::FromWebContents(web_contents));
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // LoginHandlerViews uses a constrained window for the password manager view.
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsModalDialogManager::CreateForWebContents(web_contents);
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebContentsModalDialogManager::FromWebContents(web_contents)->
2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      SetDelegate(this);
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!popup_manager_.get())
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    popup_manager_.reset(new web_modal::PopupManager(this));
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  popup_manager_->RegisterWith(web_contents);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents->SetDelegate(this);
21323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  extensions::ChromeExtensionWebContentsObserver::CreateForWebContents(
21423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      web_contents);
2158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  WebContentsObserver::Observe(web_contents);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderer_preferences_util::UpdateFromSystemSettings(
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents->GetMutableRendererPrefs(),
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      signin_profile);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* WebUILoginView::GetClassName() const {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kViewClassName;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WebUILoginView::RequestFocus() {
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  webui_login_->RequestFocus();
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)web_modal::WebContentsModalDialogHost*
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    WebUILoginView::GetWebContentsModalDialogHost() {
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return this;
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)gfx::NativeView WebUILoginView::GetHostView() const {
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return GetWidget()->GetNativeView();
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)gfx::Point WebUILoginView::GetDialogPosition(const gfx::Size& size) {
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Center the widget.
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Size widget_size = GetWidget()->GetWindowBoundsInScreen().size();
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return gfx::Point(widget_size.width() / 2 - size.width() / 2,
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    widget_size.height() / 2 - size.height() / 2);
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Size WebUILoginView::GetMaximumDialogSize() {
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return GetWidget()->GetWindowBoundsInScreen().size();
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebUILoginView::AddObserver(
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    web_modal::ModalDialogHostObserver* observer) {
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (observer && !observer_list_.HasObserver(observer))
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    observer_list_.AddObserver(observer);
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WebUILoginView::RemoveObserver(
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    web_modal::ModalDialogHostObserver* observer) {
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  observer_list_.RemoveObserver(observer);
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUILoginView::AcceleratorPressed(
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::Accelerator& accelerator) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AccelMap::const_iterator entry = accel_map_.find(accelerator);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry == accel_map_.end())
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!webui_login_)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WebUI* web_ui = GetWebUI();
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_ui) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::StringValue accel_name(entry->second);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui->CallJavascriptFunction("cr.ui.Oobe.handleAccelerator",
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   accel_name);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow WebUILoginView::GetNativeWindow() const {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetWidget()->GetNativeWindow();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::LoadURL(const GURL & url) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webui_login_->LoadInitialURL(url);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webui_login_->RequestFocus();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(nkostylev): Use WebContentsObserver::RenderViewCreated to track
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // when RenderView is created.
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GetWebContents()->GetRenderViewHost()->GetView()->SetBackgroundOpaque(false);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebUI* WebUILoginView::GetWebUI() {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return webui_login_->web_contents()->GetWebUI();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::WebContents* WebUILoginView::GetWebContents() {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return webui_login_->web_contents();
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::OpenProxySettings() {
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const NetworkState* network =
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!network) {
304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LOG(ERROR) << "No default network found!";
305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProxySettingsDialog* dialog =
308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      new ProxySettingsDialog(ProfileHelper::GetSigninProfile(),
309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              *network, NULL, GetNativeWindow());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dialog->Show();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::OnPostponedShow() {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_is_hidden(false);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnLoginPromptVisible();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::SetStatusAreaVisible(bool visible) {
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ash::Shell::GetInstance()->HasPrimaryStatusArea()) {
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ash::SystemTray* tray = ash::Shell::GetInstance()->GetPrimarySystemTray();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (visible) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Tray may have been initialized being hidden.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tray->SetVisible(visible);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tray->GetWidget()->Show();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tray->GetWidget()->Hide();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::SetUIEnabled(bool enabled) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forward_keyboard_event_ = enabled;
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::Shell::GetInstance()->GetPrimarySystemTray()->SetEnabled(enabled);
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebUILoginView::AddFrameObserver(FrameObserver* frame_observer) {
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(frame_observer);
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(!frame_observer_list_.HasObserver(frame_observer));
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  frame_observer_list_.AddObserver(frame_observer);
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebUILoginView::RemoveFrameObserver(FrameObserver* frame_observer) {
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(frame_observer);
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(frame_observer_list_.HasObserver(frame_observer));
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  frame_observer_list_.RemoveObserver(frame_observer);
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebUILoginView protected: ---------------------------------------------------
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::Layout() {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(webui_login_);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webui_login_->SetBoundsRect(bounds());
357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FOR_EACH_OBSERVER(web_modal::ModalDialogHostObserver,
359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    observer_list_,
360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    OnPositionRequiresUpdate());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::OnLocaleChanged() {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::ChildPreferredSizeChanged(View* child) {
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Layout();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SchedulePaint();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::AboutToRequestFocusFromTabTraversal(bool reverse) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the focus to the web contents.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webui_login_->web_contents()->FocusThroughTabTraversal(reverse);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->Activate();
375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  webui_login_->web_contents()->Focus();
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::Observe(int type,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const content::NotificationSource& source,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const content::NotificationDetails& details) {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
382a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    case chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE:
38390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN: {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OnLoginPromptVisible();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      registrar_.RemoveAll();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Unexpected notification " << type;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebUILoginView private: -----------------------------------------------------
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUILoginView::HandleContextMenu(
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::ContextMenuParams& params) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not show the context menu.
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::HandleKeyboardEvent(content::WebContents* source,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const NativeWebKeyboardEvent& event) {
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (forward_keyboard_event_) {
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Disable arrow key traversal because arrow keys are handled via
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // accelerator when this view has focus.
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ScopedArrowKeyTraversal arrow_key_traversal(false);
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unhandled_keyboard_event_handler_.HandleKeyboardEvent(event,
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          GetFocusManager());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure error bubble is cleared on keyboard event. This is needed
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when the focus is inside an iframe. Only clear on KeyDown to prevent hiding
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an immediate authentication error (See crbug.com/103643).
419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (event.type == blink::WebInputEvent::KeyDown) {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebUI* web_ui = GetWebUI();
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (web_ui)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui->CallJavascriptFunction("cr.ui.Oobe.clearErrors");
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUILoginView::IsPopupOrPanel(const WebContents* source) const {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUILoginView::TakeFocus(content::WebContents* source, bool reverse) {
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In case of blocked UI (ex.: sign in is in progress)
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we should not process focus change events.
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!forward_keyboard_event_)
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ash::SystemTray* tray = ash::Shell::GetInstance()->GetPrimarySystemTray();
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tray && tray->GetWidget()->IsVisible()) {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tray->SetNextFocusableView(this);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ash::Shell::GetInstance()->RotateFocus(reverse ? ash::Shell::BACKWARD :
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                    ash::Shell::FORWARD);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::RequestMediaAccessPermission(
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents,
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::MediaStreamRequest& request,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::MediaResponseCallback& callback) {
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (MediaStreamInfoBarDelegate::Create(web_contents, request, callback))
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Media stream not allowed for WebUI";
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool WebUILoginView::CheckMediaAccessPermission(
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    content::WebContents* web_contents,
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL& security_origin,
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    content::MediaStreamType type) {
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return MediaCaptureDevicesDispatcher::GetInstance()
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->CheckMediaAccessPermission(web_contents, security_origin, type);
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WebUILoginView::PreHandleGestureEvent(
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::WebContents* source,
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const blink::WebGestureEvent& event) {
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Disable pinch zooming.
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return event.type == blink::WebGestureEvent::GesturePinchBegin ||
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      event.type == blink::WebGestureEvent::GesturePinchUpdate ||
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      event.type == blink::WebGestureEvent::GesturePinchEnd;
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void WebUILoginView::DidFailProvisionalLoad(
474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::RenderFrameHost* render_frame_host,
4758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const GURL& validated_url,
4768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    int error_code,
477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::string16& error_description) {
478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FOR_EACH_OBSERVER(FrameObserver,
479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    frame_observer_list_,
480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    OnFrameError(render_frame_host->GetFrameName()));
481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (render_frame_host->GetFrameName() != "gaia-frame")
4828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return;
4838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  GetWebUI()->CallJavascriptFunction("login.GaiaSigninScreen.onFrameError",
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     base::FundamentalValue(-error_code),
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     base::StringValue(validated_url.spec()));
4878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
4888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::OnLoginPromptVisible() {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're hidden than will generate this signal once we're shown.
49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (is_hidden_ || webui_visible_) {
492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    VLOG(1) << "Login WebUI >> not emitting signal, hidden: " << is_hidden_;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TRACE_EVENT0("chromeos", "WebUILoginView::OnLoginPromoptVisible");
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (should_emit_login_prompt_visible_) {
497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    VLOG(1) << "Login WebUI >> login-prompt-visible";
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::DBusThreadManager::Get()->GetSessionManagerClient()->
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        EmitLoginPromptVisible();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  webui_visible_ = true;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUILoginView::ReturnFocus(bool reverse) {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the focus to the web contents.
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webui_login_->web_contents()->FocusThroughTabTraversal(reverse);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetWidget()->Activate();
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
512