blob: c58ed62ffde7ef034414e5b7039b09e48d0a5893 [file] [log] [blame]
// Copyright 2012 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_web_dialog_delegate_base.h"
#include <gdk/gdk.h>
#include <gtk/gtk.h>
#include "chrome/browser/ui/gtk/constrained_window_gtk.h"
#include "components/web_modal/web_contents_modal_dialog_manager.h"
#include "content/public/browser/notification_source.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_view.h"
#include "ui/base/gtk/gtk_hig_constants.h"
#include "ui/base/gtk/gtk_signal.h"
#include "ui/gfx/size.h"
#include "ui/web_dialogs/web_dialog_delegate.h"
#include "ui/web_dialogs/web_dialog_ui.h"
using content::WebContents;
using ui::WebDialogDelegate;
using ui::WebDialogWebContentsDelegate;
using web_modal::WebContentsModalDialogManager;
namespace {
class ConstrainedWebDialogDelegateGtk
: public ConstrainedWebDialogDelegateBase {
public:
ConstrainedWebDialogDelegateGtk(
content::BrowserContext* browser_context,
WebDialogDelegate* delegate,
WebDialogWebContentsDelegate* tab_delegate)
: ConstrainedWebDialogDelegateBase(
browser_context, delegate, tab_delegate),
window_(NULL) {}
// WebDialogWebContentsDelegate interface.
virtual void CloseContents(WebContents* source) OVERRIDE {
gtk_widget_destroy(window_);
}
void set_window(GtkWidget* window) { window_ = window; }
GtkWidget* window() const { return window_; }
private:
GtkWidget* window_;
DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateGtk);
};
void SetBackgroundColor(GtkWidget* widget, const GdkColor &color) {
gtk_widget_modify_base(widget, GTK_STATE_NORMAL, &color);
gtk_widget_modify_fg(widget, GTK_STATE_NORMAL, &color);
gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &color);
}
} // namespace
class ConstrainedWebDialogDelegateViewGtk
: public ConstrainedWebDialogDelegate {
public:
ConstrainedWebDialogDelegateViewGtk(
content::BrowserContext* browser_context,
WebDialogDelegate* delegate,
WebDialogWebContentsDelegate* tab_delegate);
virtual ~ConstrainedWebDialogDelegateViewGtk() {}
// ConstrainedWebDialogDelegate interface
virtual const WebDialogDelegate*
GetWebDialogDelegate() const OVERRIDE {
return impl_->GetWebDialogDelegate();
}
virtual WebDialogDelegate* GetWebDialogDelegate() OVERRIDE {
return impl_->GetWebDialogDelegate();
}
virtual void OnDialogCloseFromWebUI() OVERRIDE {
return impl_->OnDialogCloseFromWebUI();
}
virtual void ReleaseWebContentsOnDialogClose() OVERRIDE {
return impl_->ReleaseWebContentsOnDialogClose();
}
virtual web_modal::NativeWebContentsModalDialog GetNativeDialog() OVERRIDE {
return impl_->window();
}
virtual WebContents* GetWebContents() OVERRIDE {
return impl_->GetWebContents();
}
void SetWindow(GtkWidget* window) {
impl_->set_window(window);
}
GtkWidget* GetWindow() {
return impl_->window();
}
private:
CHROMEGTK_CALLBACK_0(ConstrainedWebDialogDelegateViewGtk, void, OnDestroy);
scoped_ptr<ConstrainedWebDialogDelegateGtk> impl_;
DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewGtk);
};
ConstrainedWebDialogDelegateViewGtk::ConstrainedWebDialogDelegateViewGtk(
content::BrowserContext* browser_context,
WebDialogDelegate* delegate,
WebDialogWebContentsDelegate* tab_delegate)
: impl_(new ConstrainedWebDialogDelegateGtk(
browser_context,
delegate,
tab_delegate)) {
gfx::Size dialog_size;
delegate->GetDialogSize(&dialog_size);
GtkWidget* contents =
GTK_WIDGET(GetWebContents()->GetView()->GetNativeView());
gtk_widget_set_size_request(contents,
dialog_size.width(),
dialog_size.height());
gtk_widget_show_all(contents);
g_signal_connect(contents, "destroy", G_CALLBACK(OnDestroyThunk), this);
}
void ConstrainedWebDialogDelegateViewGtk::OnDestroy(GtkWidget* widget) {
if (!impl_->closed_via_webui())
GetWebDialogDelegate()->OnDialogClosed(std::string());
delete this;
}
ConstrainedWebDialogDelegate* CreateConstrainedWebDialog(
content::BrowserContext* browser_context,
WebDialogDelegate* delegate,
WebDialogWebContentsDelegate* tab_delegate,
content::WebContents* web_contents) {
ConstrainedWebDialogDelegateViewGtk* constrained_delegate =
new ConstrainedWebDialogDelegateViewGtk(
browser_context, delegate, tab_delegate);
GtkWidget* window =
CreateWebContentsModalDialogGtk(
constrained_delegate->GetWebContents()->GetView()->GetNativeView(),
constrained_delegate->GetWebContents()->GetView()->
GetContentNativeView());
SetBackgroundColor(window, ui::kGdkWhite);
constrained_delegate->SetWindow(window);
WebContentsModalDialogManager* web_contents_modal_dialog_manager =
WebContentsModalDialogManager::FromWebContents(web_contents);
web_contents_modal_dialog_manager->ShowDialog(window);
return constrained_delegate;
}