172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// found in the LICENSE file. 4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/constrained_html_ui.h" 6513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/constrained_window_gtk.h" 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/gtk_util.h" 104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/views/tab_contents/tab_contents_container.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/tab_contents/tab_contents.h" 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h" 154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/widget/widget_gtk.h" 16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// ConstrainedHtmlDelegateGtk works with ConstrainedWindowGtk to present 184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// a TabContents in a ContraintedHtmlUI. 194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ConstrainedHtmlDelegateGtk : public views::WidgetGtk, 20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public ConstrainedHtmlUIDelegate, 21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public ConstrainedWindowDelegate, 22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public HtmlDialogTabContentsDelegate { 23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public: 244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ConstrainedHtmlDelegateGtk(Profile* profile, 25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HtmlDialogUIDelegate* delegate); 264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ~ConstrainedHtmlDelegateGtk(); 27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // ConstrainedHtmlUIDelegate interface. 29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual HtmlDialogUIDelegate* GetHtmlDialogUIDelegate(); 30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void OnDialogClose(); 314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual bool GetBackgroundColor(GdkColor* color) { 324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch *color = gtk_util::kGdkWhite; 334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return true; 344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 35513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // ConstrainedWindowGtkDelegate implementation. 374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual GtkWidget* GetWidgetRoot() { 384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return GetNativeView(); 39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual GtkWidget* GetFocusWidget() { 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return html_tab_contents_.GetContentNativeView(); 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void DeleteDelegate() { 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen html_delegate_->OnWindowClosed(); 45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_delegate_->OnDialogClosed(""); 464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch tab_container_->ChangeTabContents(NULL); 47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool ShouldHaveBorderPadding() const { 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // HtmlDialogTabContentsDelegate interface. 53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void MoveContents(TabContents* source, const gfx::Rect& pos) {} 54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {} 55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void set_window(ConstrainedWindow* window) { 57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch window_ = window; 58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private: 61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TabContents html_tab_contents_; 624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch TabContentsContainer* tab_container_; 63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HtmlDialogUIDelegate* html_delegate_; 65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The constrained window that owns |this|. Saved so we can close it later. 67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ConstrainedWindow* window_; 68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}; 69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochConstrainedHtmlDelegateGtk::ConstrainedHtmlDelegateGtk( 71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Profile* profile, 72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HtmlDialogUIDelegate* delegate) 734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch : views::WidgetGtk(views::WidgetGtk::TYPE_CHILD), 744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch HtmlDialogTabContentsDelegate(profile), 75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_tab_contents_(profile, NULL, MSG_ROUTING_NONE, NULL, NULL), 764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch tab_container_(NULL), 77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_delegate_(delegate), 78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch window_(NULL) { 79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CHECK(delegate); 80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_tab_contents_.set_delegate(this); 81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Set |this| as a property so the ConstrainedHtmlUI can retrieve it. 83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ConstrainedHtmlUI::GetPropertyAccessor().SetProperty( 84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_tab_contents_.property_bag(), this); 85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_tab_contents_.controller().LoadURL(delegate->GetDialogContentURL(), 86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL(), 87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch PageTransition::START_PAGE); 884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Init(NULL, gfx::Rect()); 904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch tab_container_ = new TabContentsContainer; 924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch SetContentsView(tab_container_); 934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch tab_container_->ChangeTabContents(&html_tab_contents_); 944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch gfx::Size dialog_size; 964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch html_delegate_->GetDialogSize(&dialog_size); 974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch gtk_widget_set_size_request(GetWidgetRoot(), 984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch dialog_size.width(), 994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch dialog_size.height()); 100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochConstrainedHtmlDelegateGtk::~ConstrainedHtmlDelegateGtk() { 103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochHtmlDialogUIDelegate* ConstrainedHtmlDelegateGtk::GetHtmlDialogUIDelegate() { 106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return html_delegate_; 107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid ConstrainedHtmlDelegateGtk::OnDialogClose() { 110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch window_->CloseConstrainedWindow(); 111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// static 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenConstrainedWindow* ConstrainedHtmlUI::CreateConstrainedHtmlDialog( 115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Profile* profile, 116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HtmlDialogUIDelegate* delegate, 117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TabContents* container) { 1184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ConstrainedHtmlDelegateGtk* constrained_delegate = 1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch new ConstrainedHtmlDelegateGtk(profile, delegate); 120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ConstrainedWindow* constrained_window = 121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch container->CreateConstrainedDialog(constrained_delegate); 122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch constrained_delegate->set_window(constrained_window); 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return constrained_window; 124513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 125