172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be
3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file.
4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/constrained_html_ui.h"
6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/constrained_window_gtk.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/gtk_util.h"
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/tab_contents_container_gtk.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/html_dialog_tab_contents_delegate.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/html_dialog_ui.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_source.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ConstrainedHtmlDelegateGtk : public ConstrainedWindowGtkDelegate,
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                   public HtmlDialogTabContentsDelegate,
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                   public ConstrainedHtmlUIDelegate {
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ConstrainedHtmlDelegateGtk(Profile* profile,
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             HtmlDialogUIDelegate* delegate);
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual ~ConstrainedHtmlDelegateGtk();
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // ConstrainedWindowGtkDelegate ----------------------------------------------
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual GtkWidget* GetWidgetRoot() {
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return tab_contents_container_.widget();
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual GtkWidget* GetFocusWidget() {
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return tab_.tab_contents()->GetContentNativeView();
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void DeleteDelegate() {
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    html_delegate_->OnWindowClosed();
36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    html_delegate_->OnDialogClosed("");
37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    delete this;
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // ConstrainedHtmlDelegate ---------------------------------------------
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual HtmlDialogUIDelegate* GetHtmlDialogUIDelegate();
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void OnDialogClose();
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual bool GetBackgroundColor(GdkColor* color) {
44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    *color = gtk_util::kGdkWhite;
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return true;
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // HtmlDialogTabContentsDelegate ---------------------------------------------
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void MoveContents(TabContents* source, const gfx::Rect& pos) {}
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {}
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void set_window(ConstrainedWindow* window) {
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    window_ = window;
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private:
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContentsWrapper tab_;
58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TabContentsContainerGtk tab_contents_container_;
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  HtmlDialogUIDelegate* html_delegate_;
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // The constrained window that owns |this|. It's saved here because it needs
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // to be closed in response to the WebUI OnDialogClose callback.
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ConstrainedWindow* window_;
64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
66731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickConstrainedHtmlDelegateGtk::ConstrainedHtmlDelegateGtk(
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Profile* profile,
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    HtmlDialogUIDelegate* delegate)
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    : HtmlDialogTabContentsDelegate(profile),
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tab_(new TabContents(profile, NULL, MSG_ROUTING_NONE, NULL, NULL)),
71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      tab_contents_container_(NULL),
72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      html_delegate_(delegate),
73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      window_(NULL) {
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  tab_.tab_contents()->set_delegate(this);
75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Set |this| as a property on the tab contents so that the ConstrainedHtmlUI
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // can get a reference to |this|.
78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ConstrainedHtmlUI::GetPropertyAccessor().SetProperty(
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tab_.tab_contents()->property_bag(), this);
80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  tab_.tab_contents()->controller().LoadURL(
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      delegate->GetDialogContentURL(), GURL(), PageTransition::START_PAGE);
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  tab_contents_container_.SetTab(&tab_);
84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  gfx::Size dialog_size;
86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  delegate->GetDialogSize(&dialog_size);
87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  gtk_widget_set_size_request(GTK_WIDGET(tab_contents_container_.widget()),
88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              dialog_size.width(),
89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              dialog_size.height());
90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  gtk_widget_show_all(GetWidgetRoot());
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
94731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickConstrainedHtmlDelegateGtk::~ConstrainedHtmlDelegateGtk() {
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
97731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickHtmlDialogUIDelegate*
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    ConstrainedHtmlDelegateGtk::GetHtmlDialogUIDelegate() {
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return html_delegate_;
100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid ConstrainedHtmlDelegateGtk::OnDialogClose() {
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  window_->CloseConstrainedWindow();
104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenConstrainedWindow* ConstrainedHtmlUI::CreateConstrainedHtmlDialog(
108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    Profile* profile,
109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    HtmlDialogUIDelegate* delegate,
110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    TabContents* overshadowed) {
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ConstrainedHtmlDelegateGtk* constrained_delegate =
112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      new ConstrainedHtmlDelegateGtk(profile, delegate);
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ConstrainedWindow* constrained_window =
114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      overshadowed->CreateConstrainedDialog(constrained_delegate);
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  constrained_delegate->set_window(constrained_window);
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return constrained_window;
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
118