| Index: chrome/browser/chromeos/login/helper.cc
|
| diff --git a/chrome/browser/chromeos/login/helper.cc b/chrome/browser/chromeos/login/helper.cc
|
| index 2cfc6004bf842602b0441138edd94a857678aafd..14fc92b20774d84471eb0691cdd34c3109fc4898 100644
|
| --- a/chrome/browser/chromeos/login/helper.cc
|
| +++ b/chrome/browser/chromeos/login/helper.cc
|
| @@ -18,6 +18,7 @@
|
| #include "views/painter.h"
|
| #include "views/screen.h"
|
| #include "views/widget/widget.h"
|
| +#include "views/widget/widget_gtk.h"
|
|
|
| namespace chromeos {
|
|
|
| @@ -79,23 +80,38 @@ ThrobberHostView::~ThrobberHostView() {
|
|
|
| void ThrobberHostView::StartThrobber() {
|
| StopThrobber();
|
| - views::Widget* widget = host_view_->GetWidget();
|
| - if (widget) {
|
| - views::SmoothedThrobber* throbber = CreateDefaultSmoothedThrobber();
|
| - throbber->set_stop_delay_ms(0);
|
| - gfx::Rect throbber_bounds = CalculateThrobberBounds(throbber);
|
| -
|
| - throbber_widget_ =
|
| - views::Widget::CreatePopupWidget(views::Widget::Transparent,
|
| - views::Widget::NotAcceptEvents,
|
| - views::Widget::DeleteOnDestroy,
|
| - views::Widget::DontMirrorOriginInRTL);
|
| - throbber_bounds.Offset(host_view_->GetScreenBounds().origin());
|
| - throbber_widget_->InitWithWidget(widget, throbber_bounds);
|
| - throbber_widget_->SetContentsView(throbber);
|
| - throbber_widget_->Show();
|
| - throbber->Start();
|
| +
|
| + views::Widget* host_widget = host_view_->GetWidget();
|
| + if (!host_widget) {
|
| + LOG(WARNING) << "Failed to start the throbber: no Widget";
|
| + return;
|
| + }
|
| +
|
| + GtkWidget* host_gtk_window = host_widget->GetNativeView();
|
| + while (host_gtk_window && !GTK_IS_WINDOW(host_gtk_window))
|
| + host_gtk_window = gtk_widget_get_parent(host_gtk_window);
|
| + if (!host_gtk_window) {
|
| + LOG(WARNING) << "Failed to start the throbber: no GtkWindow";
|
| + return;
|
| }
|
| +
|
| + views::SmoothedThrobber* throbber = CreateDefaultSmoothedThrobber();
|
| + throbber->set_stop_delay_ms(0);
|
| + gfx::Rect throbber_bounds = CalculateThrobberBounds(throbber);
|
| +
|
| + views::WidgetGtk* widget_gtk =
|
| + new views::WidgetGtk(views::WidgetGtk::TYPE_WINDOW);
|
| + widget_gtk->make_transient_to_parent();
|
| + widget_gtk->MakeTransparent();
|
| + throbber_widget_ = widget_gtk;
|
| +
|
| + throbber_bounds.Offset(host_view_->GetScreenBounds().origin());
|
| + throbber_widget_->Init(host_gtk_window, throbber_bounds);
|
| + throbber_widget_->SetContentsView(throbber);
|
| + throbber_widget_->Show();
|
| + // WM can ignore bounds before widget is shown.
|
| + throbber_widget_->SetBounds(throbber_bounds);
|
| + throbber->Start();
|
| }
|
|
|
| void ThrobberHostView::StopThrobber() {
|
|
|