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/views/tab_contents/tab_contents_container.h" 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/html_dialog_tab_contents_delegate.h" 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/html_dialog_ui.h" 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h" 13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "views/view.h" 14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "views/widget/widget_win.h" 15513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "views/window/window_delegate.h" 16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 17513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass ConstrainedHtmlDelegateWin : public TabContentsContainer, 18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public ConstrainedHtmlUIDelegate, 19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public ConstrainedWindowDelegate, 20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public HtmlDialogTabContentsDelegate { 21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public: 22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ConstrainedHtmlDelegateWin(Profile* profile, 23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HtmlDialogUIDelegate* delegate); 24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ~ConstrainedHtmlDelegateWin(); 25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // ConstrainedHtmlUIDelegate interface. 27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual HtmlDialogUIDelegate* GetHtmlDialogUIDelegate(); 28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void OnDialogClose(); 29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // ConstrainedWindowDelegate (aka views::WindowDelegate) interface. 31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual bool CanResize() const { return true; } 32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual views::View* GetContentsView() { 33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return this; 34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 35513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void WindowClosing() { 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen html_delegate_->OnWindowClosed(); 37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_delegate_->OnDialogClosed(""); 38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // HtmlDialogTabContentsDelegate interface. 41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void MoveContents(TabContents* source, const gfx::Rect& pos) {} 42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {} 43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Overridden from TabContentsContainer. 45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual gfx::Size GetPreferredSize() { 46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch gfx::Size size; 47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_delegate_->GetDialogSize(&size); 48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return size; 49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual void ViewHierarchyChanged(bool is_add, 52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch views::View* parent, 53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch views::View* child) { 54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TabContentsContainer::ViewHierarchyChanged(is_add, parent, child); 55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (is_add && child == this) { 56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ChangeTabContents(&html_tab_contents_); 57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void set_window(ConstrainedWindow* window) { 61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch window_ = window; 62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private: 65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TabContents html_tab_contents_; 66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HtmlDialogUIDelegate* html_delegate_; 68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // The constrained window that owns |this|. Saved so we can close it later. 70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ConstrainedWindow* window_; 71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}; 72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 73513209b27ff55e2841eac0e4120199c23acce758Ben MurdochConstrainedHtmlDelegateWin::ConstrainedHtmlDelegateWin( 74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Profile* profile, 75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HtmlDialogUIDelegate* delegate) 76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch : HtmlDialogTabContentsDelegate(profile), 77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_tab_contents_(profile, NULL, MSG_ROUTING_NONE, NULL, NULL), 78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_delegate_(delegate), 79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch window_(NULL) { 80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CHECK(delegate); 81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_tab_contents_.set_delegate(this); 82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Set |this| as a property so the ConstrainedHtmlUI can retrieve it. 84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ConstrainedHtmlUI::GetPropertyAccessor().SetProperty( 85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_tab_contents_.property_bag(), this); 86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_tab_contents_.controller().LoadURL(delegate->GetDialogContentURL(), 87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GURL(), 88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch PageTransition::START_PAGE); 89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 91513209b27ff55e2841eac0e4120199c23acce758Ben MurdochConstrainedHtmlDelegateWin::~ConstrainedHtmlDelegateWin() { 92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 94513209b27ff55e2841eac0e4120199c23acce758Ben MurdochHtmlDialogUIDelegate* ConstrainedHtmlDelegateWin::GetHtmlDialogUIDelegate() { 95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return html_delegate_; 96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 98513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid ConstrainedHtmlDelegateWin::OnDialogClose() { 99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch window_->CloseConstrainedWindow(); 100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// static 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenConstrainedWindow* ConstrainedHtmlUI::CreateConstrainedHtmlDialog( 104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Profile* profile, 105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch HtmlDialogUIDelegate* delegate, 106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch TabContents* container) { 107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ConstrainedHtmlDelegateWin* constrained_delegate = 108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch new ConstrainedHtmlDelegateWin(profile, delegate); 109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ConstrainedWindow* constrained_window = 110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch container->CreateConstrainedDialog(constrained_delegate); 111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch constrained_delegate->set_window(constrained_window); 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return constrained_window; 113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 114