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