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