summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornkostylev@chromium.org <nkostylev@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-02 02:17:42 +0000
committernkostylev@chromium.org <nkostylev@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-02 02:17:42 +0000
commitb1336f6e026bc492b51ab3680b06d4e6e83dc076 (patch)
treec87e2aa1a5191fc14788f7d59f545fdde93e0543
parente11e56c9dff5f348191b639cbc0358022be9d9f9 (diff)
downloadchromium_src-b1336f6e026bc492b51ab3680b06d4e6e83dc076.zip
chromium_src-b1336f6e026bc492b51ab3680b06d4e6e83dc076.tar.gz
chromium_src-b1336f6e026bc492b51ab3680b06d4e6e83dc076.tar.bz2
[cros] Create separate window for network dropdown on WebUI OOBE.
Control works and is positioned correctly. Some UI polishing is needed: - Bring visual style closer to select elements, update width on all of them. - Control is not refreshed on recreation. - Switching back to network screen, background flashes. BUG=chromium-os:16177 TEST=Manual. Booted with WebUI OOBE, observed working control. Switched between screens. Review URL: http://codereview.chromium.org/7285029 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@91403 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/chromeos/login/webui_login_display.cc1
-rw-r--r--chrome/browser/chromeos/login/webui_login_display_host.cc2
-rw-r--r--chrome/browser/resources/chromeos/oobe.html2
-rw-r--r--chrome/browser/resources/chromeos/oobe.js39
-rw-r--r--chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc106
-rw-r--r--chrome/browser/ui/webui/chromeos/login/network_screen_handler.h24
6 files changed, 162 insertions, 12 deletions
diff --git a/chrome/browser/chromeos/login/webui_login_display.cc b/chrome/browser/chromeos/login/webui_login_display.cc
index d098f38..25b1c60 100644
--- a/chrome/browser/chromeos/login/webui_login_display.cc
+++ b/chrome/browser/chromeos/login/webui_login_display.cc
@@ -51,7 +51,6 @@ void WebUILoginDisplay::Init(const std::vector<UserManager::User>& users,
bool show_new_user) {
// Testing that the delegate has been set.
DCHECK(delegate_);
-
users_ = users;
}
diff --git a/chrome/browser/chromeos/login/webui_login_display_host.cc b/chrome/browser/chromeos/login/webui_login_display_host.cc
index 46d8be1..06cd45a 100644
--- a/chrome/browser/chromeos/login/webui_login_display_host.cc
+++ b/chrome/browser/chromeos/login/webui_login_display_host.cc
@@ -77,7 +77,6 @@ void WebUILoginDisplayHost::StartWizard(const std::string& first_screen_name,
void WebUILoginDisplayHost::StartSignInScreen() {
LoadURL(GURL(kLoginURL));
- WebUILoginDisplay::GetInstance()->set_login_window(login_window_);
BaseLoginDisplayHost::StartSignInScreen();
}
@@ -100,6 +99,7 @@ void WebUILoginDisplayHost::LoadURL(const GURL& url) {
login_view_->UpdateWindowType();
login_window_->Show();
+ WebUILoginDisplay::GetInstance()->set_login_window(login_window_);
}
login_view_->LoadURL(url);
}
diff --git a/chrome/browser/resources/chromeos/oobe.html b/chrome/browser/resources/chromeos/oobe.html
index dc31471..ed4b160 100644
--- a/chrome/browser/resources/chromeos/oobe.html
+++ b/chrome/browser/resources/chromeos/oobe.html
@@ -48,7 +48,7 @@
<div i18n-content="selectNetwork" class="label"
class="menu-control"></div>
<div class="menu-area">
- <!-- TODO(nkostylev): Embed network control. -->
+ <div id="network-control"></div>
</div>
</div>
</div>
diff --git a/chrome/browser/resources/chromeos/oobe.js b/chrome/browser/resources/chromeos/oobe.js
index 35dae9e..9afc950 100644
--- a/chrome/browser/resources/chromeos/oobe.js
+++ b/chrome/browser/resources/chromeos/oobe.js
@@ -59,16 +59,38 @@ cr.define('cr.ui', function() {
// Adjust inner container height based on new step's height.
$('inner-container').style.height = newStep.offsetHeight;
- oldStep.addEventListener('webkitTransitionEnd', function f(e) {
- oldStep.removeEventListener('webkitTransitionEnd', f);
- oldStep.classList.add('hidden');
- });
+ if (this.currentStep_ != nextStepIndex) {
+ oldStep.addEventListener('webkitTransitionEnd', function f(e) {
+ oldStep.removeEventListener('webkitTransitionEnd', f);
+ oldStep.classList.add('hidden');
+ if (nextStepIndex == 0)
+ Oobe.refreshNetworkControl();
+ });
+ } else if (nextStepIndex == 0) {
+ Oobe.refreshNetworkControl();
+ }
this.currentStep_ = nextStepIndex;
$('oobe').className = nextStepId;
},
};
/**
+ * Returns offset (top, left) of the element.
+ * @param {!Element} element HTML element
+ * @return {!Object} The offset (top, left).
+ */
+ Oobe.getOffset = function(element) {
+ var x = 0;
+ var y = 0;
+ while(element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) {
+ x += element.offsetLeft - element.scrollLeft;
+ y += element.offsetTop - element.scrollTop;
+ element = element.offsetParent;
+ }
+ return { top: y, left: x };
+ };
+
+ /**
* Initializes the OOBE flow. This will cause all C++ handlers to
* be invoked to do final setup.
*/
@@ -113,6 +135,15 @@ cr.define('cr.ui', function() {
};
/**
+ * Refreshes position of the network control (on connect screen).
+ */
+ Oobe.refreshNetworkControl = function() {
+ var controlOffset = Oobe.getOffset($('network-control'));
+ chrome.send('networkControlPosition',
+ [controlOffset.left, controlOffset.top]);
+ };
+
+ /**
* Sets usage statistics checkbox.
* @param {bool} whether the checkbox is checked.
*/
diff --git a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc
index e8db746..41fa64c 100644
--- a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.cc
@@ -6,20 +6,61 @@
#include "base/memory/scoped_ptr.h"
#include "base/values.h"
+#include "chrome/browser/chromeos/login/webui_login_display.h"
+#include "chrome/browser/chromeos/status/network_dropdown_button.h"
+#include "chrome/browser/chromeos/wm_ipc.h"
#include "grit/chromium_strings.h"
#include "grit/generated_resources.h"
+#include "views/layout/fill_layout.h"
+#include "views/widget/widget.h"
#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/rect.h"
+
+namespace {
+
+// JS API callbacks names.
+const char kJsApiNetworkOnExit[] = "networkOnExit";
+const char kJsApiNetworkControlPosition[] = "networkControlPosition";
+
+// Width/height of the network control window.
+const int kNetworkControlWidth = 150;
+const int kNetworkControlHeight = 25;
+
+// Offsets for the network dropdown control menu.
+const int kMenuHorizontalOffset = -3;
+const int kMenuVerticalOffset = -1;
+
+// Initializes menu button default properties.
+static void InitMenuButtonProperties(views::MenuButton* menu_button) {
+ menu_button->set_focusable(true);
+ menu_button->SetEnabledColor(SK_ColorBLACK);
+ menu_button->SetHighlightColor(SK_ColorBLACK);
+ menu_button->SetHoverColor(SK_ColorBLACK);
+ menu_button->set_animate_on_state_change(false);
+ // Menu is positioned by bottom right corner of the MenuButton.
+ menu_button->set_menu_offset(kMenuHorizontalOffset, kMenuVerticalOffset);
+}
+
+} // namespace
namespace chromeos {
+// NetworkScreenHandler, public: -----------------------------------------------
+
NetworkScreenHandler::NetworkScreenHandler()
- : screen_(NULL), is_continue_enabled_(false), show_on_init_(false) {
+ : network_window_(NULL),
+ screen_(NULL),
+ is_continue_enabled_(false),
+ show_on_init_(false) {
}
NetworkScreenHandler::~NetworkScreenHandler() {
ClearErrors();
+ CloseNetworkWindow();
}
+// NetworkScreenHandler, NetworkScreenActor implementation: --------------------
+
void NetworkScreenHandler::SetDelegate(NetworkScreenActor::Delegate* screen) {
screen_ = screen;
}
@@ -37,6 +78,7 @@ void NetworkScreenHandler::Show() {
}
void NetworkScreenHandler::Hide() {
+ CloseNetworkWindow();
}
void NetworkScreenHandler::ShowError(const string16& message) {
@@ -74,6 +116,8 @@ void NetworkScreenHandler::EnableContinue(bool enabled) {
*enabled_value);
}
+// NetworkScreenHandler, OobeMessageHandler implementation: --------------------
+
void NetworkScreenHandler::GetLocalizedStrings(
DictionaryValue* localized_strings) {
localized_strings->SetString("networkScreenTitle",
@@ -98,14 +142,68 @@ void NetworkScreenHandler::Initialize() {
}
}
+// NetworkScreenHandler, WebUIMessageHandler implementation: -------------------
+
void NetworkScreenHandler::RegisterMessages() {
- web_ui_->RegisterMessageCallback("networkOnExit",
- NewCallback(this, &NetworkScreenHandler::OnExit));
+ web_ui_->RegisterMessageCallback(kJsApiNetworkControlPosition,
+ NewCallback(this, &NetworkScreenHandler::HandleNetworkControlPosition));
+ web_ui_->RegisterMessageCallback(kJsApiNetworkOnExit,
+ NewCallback(this, &NetworkScreenHandler::HandleOnExit));
+}
+
+// NetworkScreenHandler, private: ----------------------------------------------
+
+void NetworkScreenHandler::HandleNetworkControlPosition(const ListValue* args) {
+ const size_t kParamCount = 2;
+ double x, y;
+ if (args->GetSize() != kParamCount ||
+ !args->GetDouble(0, &x) ||
+ !args->GetDouble(1, &y)) {
+ NOTREACHED();
+ return;
+ }
+ network_control_pos_.SetPoint(static_cast<int>(x), static_cast<int>(y));
+ CreateOrUpdateNetworkWindow();
}
-void NetworkScreenHandler::OnExit(const ListValue* args) {
+void NetworkScreenHandler::HandleOnExit(const ListValue* args) {
ClearErrors();
screen_->OnContinuePressed();
}
+void NetworkScreenHandler::CreateOrUpdateNetworkWindow() {
+ views::Widget* login_window = WebUILoginDisplay::GetLoginWindow();
+ gfx::Rect login_bounds = login_window->GetWindowScreenBounds();
+ gfx::Rect bounds(login_bounds.x() + network_control_pos_.x(),
+ login_bounds.y() + network_control_pos_.y(),
+ kNetworkControlWidth, kNetworkControlHeight);
+ if (!network_window_) {
+ views::Widget::InitParams widget_params(
+ views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
+ widget_params.bounds = bounds;
+ widget_params.double_buffer = true;
+ widget_params.parent = login_window->GetNativeView();
+ network_window_ = new views::Widget;
+ network_window_->Init(widget_params);
+ std::vector<int> params;
+ chromeos::WmIpc::instance()->SetWindowType(
+ network_window_->GetNativeView(),
+ chromeos::WM_IPC_WINDOW_CHROME_INFO_BUBBLE,
+ &params);
+ NetworkDropdownButton* button =
+ new NetworkDropdownButton(false, login_window->GetNativeWindow());
+ InitMenuButtonProperties(button);
+ network_window_->SetContentsView(button);
+ network_window_->Show();
+ } else {
+ network_window_->SetBounds(bounds);
+ }
+}
+
+void NetworkScreenHandler::CloseNetworkWindow() {
+ if (network_window_)
+ network_window_->Close();
+ network_window_ = NULL;
+}
+
} // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h
index 968df19..3f78580 100644
--- a/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/network_screen_handler.h
@@ -9,9 +9,14 @@
#include "chrome/browser/chromeos/login/network_screen_actor.h"
#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
#include "content/browser/webui/web_ui.h"
+#include "ui/gfx/point.h"
class ListValue;
+namespace views {
+class Widget;
+}
+
namespace chromeos {
// WebUI implementation of NetworkScreenActor. It is used to interact with
@@ -41,8 +46,22 @@ class NetworkScreenHandler : public NetworkScreenActor,
virtual void RegisterMessages();
private:
+ // Handles change of the network control position.
+ void HandleNetworkControlPosition(const ListValue* args);
+
// Handles moving off the screen.
- void OnExit(const ListValue* args);
+ void HandleOnExit(const ListValue* args);
+
+ // Creates network window or updates it's bounds.
+ void CreateOrUpdateNetworkWindow();
+
+ // Closes network window.
+ void CloseNetworkWindow();
+
+ // Window that contains network dropdown button.
+ // TODO(nkostylev): Temporary solution till we have
+ // RenderWidgetHostViewViews working.
+ views::Widget* network_window_;
NetworkScreenActor::Delegate* screen_;
@@ -51,6 +70,9 @@ class NetworkScreenHandler : public NetworkScreenActor,
// Keeps whether screen should be shown right after initialization.
bool show_on_init_;
+ // Position of the network control.
+ gfx::Point network_control_pos_;
+
DISALLOW_COPY_AND_ASSIGN(NetworkScreenHandler);
};