Index: chrome/browser/ui/views/html_dialog_view.cc |
diff --git a/chrome/browser/ui/views/html_dialog_view.cc b/chrome/browser/ui/views/html_dialog_view.cc |
index 67341f2131202dc95c68e81a86732ccfdaec7f0b..fe83915e7a1ae869e334768cf28991dfa7cd9dc7 100644 |
--- a/chrome/browser/ui/views/html_dialog_view.cc |
+++ b/chrome/browser/ui/views/html_dialog_view.cc |
@@ -10,6 +10,9 @@ |
#include "chrome/browser/ui/views/window.h" |
#include "content/browser/tab_contents/tab_contents.h" |
#include "content/common/native_web_keyboard_event.h" |
+#include "content/common/notification_details.h" |
+#include "content/common/notification_source.h" |
+#include "content/common/notification_type.h" |
#include "ui/base/keycodes/keyboard_codes.h" |
#include "views/events/event.h" |
#include "views/widget/root_view.h" |
@@ -20,6 +23,8 @@ |
#include "views/window/native_window_gtk.h" |
#endif |
+class RenderWidgetHost; |
+ |
namespace browser { |
// Declared in browser_dialogs.h so that others don't need to depend on our .h. |
@@ -42,6 +47,7 @@ HtmlDialogView::HtmlDialogView(Profile* profile, |
HtmlDialogUIDelegate* delegate) |
: DOMView(), |
HtmlDialogTabContentsDelegate(profile), |
+ state_(NONE), |
delegate_(delegate) { |
} |
@@ -66,6 +72,20 @@ bool HtmlDialogView::AcceleratorPressed(const views::Accelerator& accelerator) { |
return true; |
} |
+void HtmlDialogView::ViewHierarchyChanged( |
+ bool is_add, View* parent, View* child) { |
+ DOMView::ViewHierarchyChanged(is_add, parent, child); |
+ if (is_add && GetWidget() && state_ == NONE) { |
+ state_ = INITIALIZED; |
+#if defined(OS_CHROMEOS) |
sky
2011/06/07 15:41:17
Should the ifdefs be OS_LINUX?
oshima
2011/06/07 19:08:58
This make sense only with chromeos wm. Note that t
|
+ CHECK( |
+ static_cast<views::NativeWidgetGtk*>( |
+ GetWidget()->native_widget())->SuppressFreezeUpdates()); |
+#endif |
+ RegisterDialogAccelerators(); |
+ } |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// HtmlDialogView, views::WindowDelegate implementation: |
@@ -222,9 +242,44 @@ void HtmlDialogView::InitDialog() { |
// the comment above HtmlDialogUI in its header file for why. |
HtmlDialogUI::GetPropertyAccessor().SetProperty(tab_contents_->property_bag(), |
this); |
+ notification_registrar_.Add( |
+ this, |
+ NotificationType::RENDER_VIEW_HOST_CREATED_FOR_TAB, |
+ Source<TabContents>(tab_contents())); |
+ notification_registrar_.Add( |
+ this, |
+ NotificationType::LOAD_COMPLETED_MAIN_FRAME, |
+ Source<TabContents>(tab_contents())); |
+ |
+ DOMView::LoadURL(GetDialogContentURL()); |
+} |
+void HtmlDialogView::Observe(NotificationType type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details) { |
+ if (type == NotificationType::RENDER_VIEW_HOST_CREATED_FOR_TAB) { |
sky
2011/06/07 15:41:17
nit: a switch would be more readable here.
oshima
2011/06/07 19:08:58
Done.
|
+ RenderWidgetHost* rwh = Details<RenderWidgetHost>(details).ptr(); |
+ notification_registrar_.Add( |
+ this, |
+ NotificationType::RENDER_WIDGET_HOST_DID_PAINT, |
+ Source<RenderWidgetHost>(rwh)); |
+ return; |
+ } |
+ |
+ if (type == NotificationType::LOAD_COMPLETED_MAIN_FRAME && |
+ state_ == INITIALIZED) { |
+ state_ = LOADED; |
+ } else if (type == NotificationType::RENDER_WIDGET_HOST_DID_PAINT && |
+ state_ == LOADED) { |
+ state_ = PAINTED; |
+#if defined(OS_CHROMEOS) |
+ views::NativeWidgetGtk::UpdateFreezeUpdatesProperty( |
+ GTK_WINDOW(GetWidget()->GetNativeView()), false); |
+#endif |
+ } |
+} |
+ |
+void HtmlDialogView::RegisterDialogAccelerators() { |
// Pressing the ESC key will close the dialog. |
AddAccelerator(views::Accelerator(ui::VKEY_ESCAPE, false, false, false)); |
- |
- DOMView::LoadURL(GetDialogContentURL()); |
} |