// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/ui/webui/constrained_html_ui.h" #include "chrome/browser/ui/gtk/constrained_window_gtk.h" #include "chrome/browser/ui/gtk/gtk_util.h" #include "chrome/browser/ui/gtk/tab_contents_container_gtk.h" #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" #include "chrome/browser/ui/webui/html_dialog_tab_contents_delegate.h" #include "chrome/browser/ui/webui/html_dialog_ui.h" #include "content/browser/renderer_host/render_view_host.h" #include "content/browser/tab_contents/tab_contents.h" #include "content/common/notification_source.h" #include "ui/gfx/rect.h" class ConstrainedHtmlDelegateGtk : public ConstrainedWindowGtkDelegate, public HtmlDialogTabContentsDelegate, public ConstrainedHtmlUIDelegate { public: ConstrainedHtmlDelegateGtk(Profile* profile, HtmlDialogUIDelegate* delegate); virtual ~ConstrainedHtmlDelegateGtk(); // ConstrainedWindowGtkDelegate ---------------------------------------------- virtual GtkWidget* GetWidgetRoot() { return tab_contents_container_.widget(); } virtual GtkWidget* GetFocusWidget() { return tab_.tab_contents()->GetContentNativeView(); } virtual void DeleteDelegate() { html_delegate_->OnDialogClosed(""); delete this; } // ConstrainedHtmlDelegate --------------------------------------------- virtual HtmlDialogUIDelegate* GetHtmlDialogUIDelegate(); virtual void OnDialogClose(); virtual bool GetBackgroundColor(GdkColor* color) { *color = gtk_util::kGdkWhite; return true; } // HtmlDialogTabContentsDelegate --------------------------------------------- void MoveContents(TabContents* source, const gfx::Rect& pos) {} void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {} void set_window(ConstrainedWindow* window) { window_ = window; } private: TabContentsWrapper tab_; TabContentsContainerGtk tab_contents_container_; HtmlDialogUIDelegate* html_delegate_; // The constrained window that owns |this|. It's saved here because it needs // to be closed in response to the WebUI OnDialogClose callback. ConstrainedWindow* window_; }; ConstrainedHtmlDelegateGtk::ConstrainedHtmlDelegateGtk( Profile* profile, HtmlDialogUIDelegate* delegate) : HtmlDialogTabContentsDelegate(profile), tab_(new TabContents(profile, NULL, MSG_ROUTING_NONE, NULL, NULL)), tab_contents_container_(NULL), html_delegate_(delegate), window_(NULL) { tab_.tab_contents()->set_delegate(this); // Set |this| as a property on the tab contents so that the ConstrainedHtmlUI // can get a reference to |this|. ConstrainedHtmlUI::GetPropertyAccessor().SetProperty( tab_.tab_contents()->property_bag(), this); tab_.tab_contents()->controller().LoadURL( delegate->GetDialogContentURL(), GURL(), PageTransition::START_PAGE); tab_contents_container_.SetTab(&tab_); gfx::Size dialog_size; delegate->GetDialogSize(&dialog_size); gtk_widget_set_size_request(GTK_WIDGET(tab_contents_container_.widget()), dialog_size.width(), dialog_size.height()); gtk_widget_show_all(GetWidgetRoot()); } ConstrainedHtmlDelegateGtk::~ConstrainedHtmlDelegateGtk() { } HtmlDialogUIDelegate* ConstrainedHtmlDelegateGtk::GetHtmlDialogUIDelegate() { return html_delegate_; } void ConstrainedHtmlDelegateGtk::OnDialogClose() { window_->CloseConstrainedWindow(); } // static ConstrainedWindow* ConstrainedHtmlUI::CreateConstrainedHtmlDialog( Profile* profile, HtmlDialogUIDelegate* delegate, TabContents* overshadowed) { ConstrainedHtmlDelegateGtk* constrained_delegate = new ConstrainedHtmlDelegateGtk(profile, delegate); ConstrainedWindow* constrained_window = overshadowed->CreateConstrainedDialog(constrained_delegate); constrained_delegate->set_window(constrained_window); return constrained_window; }