| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/webui/constrained_web_dialog_delegate_base.h" | 5 #include "chrome/browser/ui/webui/constrained_web_dialog_delegate_base.h" |
| 6 | 6 |
| 7 #include "base/macros.h" | 7 #include "base/macros.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "build/build_config.h" | 9 #include "build/build_config.h" |
| 10 #include "chrome/browser/ui/browser_finder.h" | 10 #include "chrome/browser/ui/browser_finder.h" |
| 11 #include "chrome/browser/ui/browser_window.h" | 11 #include "chrome/browser/ui/browser_window.h" |
| 12 #include "chrome/browser/ui/webui/chrome_web_contents_handler.h" | 12 #include "chrome/browser/ui/webui/chrome_web_contents_handler.h" |
| 13 #include "components/constrained_window/constrained_window_views.h" | 13 #include "components/constrained_window/constrained_window_views.h" |
| 14 #include "components/web_modal/web_contents_modal_dialog_manager.h" | 14 #include "components/web_modal/web_contents_modal_dialog_manager.h" |
| 15 #include "content/public/browser/native_web_keyboard_event.h" | 15 #include "content/public/browser/native_web_keyboard_event.h" |
| 16 #include "content/public/browser/render_view_host.h" | 16 #include "content/public/browser/render_view_host.h" |
| 17 #include "content/public/browser/web_contents.h" | 17 #include "content/public/browser/web_contents.h" |
| 18 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" | 18 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" |
| 19 #include "ui/views/controls/webview/webview.h" | 19 #include "ui/views/controls/webview/webview.h" |
| 20 #include "ui/views/view.h" | 20 #include "ui/views/view.h" |
| 21 #include "ui/views/widget/widget.h" | 21 #include "ui/views/widget/widget.h" |
| 22 #include "ui/views/window/dialog_delegate.h" | 22 #include "ui/views/window/dialog_delegate.h" |
| 23 #include "ui/web_dialogs/web_dialog_delegate.h" | 23 #include "ui/web_dialogs/web_dialog_delegate.h" |
| 24 #include "ui/web_dialogs/web_dialog_ui.h" | 24 #include "ui/web_dialogs/web_dialog_ui.h" |
| 25 | 25 |
| 26 #if defined(OS_WIN) |
| 27 #include "ui/base/win/shell.h" |
| 28 #endif |
| 29 |
| 26 namespace { | 30 namespace { |
| 27 | 31 |
| 28 // WebContentsObserver that tracks the lifetime of the WebContents to avoid | 32 // WebContentsObserver that tracks the lifetime of the WebContents to avoid |
| 29 // potential use after destruction. | 33 // potential use after destruction. |
| 30 class InitiatorWebContentsObserver | 34 class InitiatorWebContentsObserver |
| 31 : public content::WebContentsObserver { | 35 : public content::WebContentsObserver { |
| 32 public: | 36 public: |
| 33 explicit InitiatorWebContentsObserver(content::WebContents* web_contents) | 37 explicit InitiatorWebContentsObserver(content::WebContents* web_contents) |
| 34 : content::WebContentsObserver(web_contents) { | 38 : content::WebContentsObserver(web_contents) { |
| 35 } | 39 } |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 class ConstrainedWebDialogDelegateViewViews | 141 class ConstrainedWebDialogDelegateViewViews |
| 138 : public views::WebView, | 142 : public views::WebView, |
| 139 public ConstrainedWebDialogDelegate, | 143 public ConstrainedWebDialogDelegate, |
| 140 public views::WidgetDelegate { | 144 public views::WidgetDelegate { |
| 141 public: | 145 public: |
| 142 ConstrainedWebDialogDelegateViewViews( | 146 ConstrainedWebDialogDelegateViewViews( |
| 143 content::BrowserContext* browser_context, | 147 content::BrowserContext* browser_context, |
| 144 ui::WebDialogDelegate* delegate, | 148 ui::WebDialogDelegate* delegate, |
| 145 content::WebContents* web_contents, | 149 content::WebContents* web_contents, |
| 146 const gfx::Size& min_size, | 150 const gfx::Size& min_size, |
| 147 const gfx::Size& max_size) | 151 const gfx::Size& max_size, |
| 152 bool independent_bounds) |
| 148 : views::WebView(browser_context), | 153 : views::WebView(browser_context), |
| 149 initiator_observer_(web_contents), | 154 initiator_observer_(web_contents), |
| 150 impl_(new ConstrainedWebDialogDelegateViews(browser_context, delegate, | 155 impl_(new ConstrainedWebDialogDelegateViews(browser_context, delegate, |
| 151 &initiator_observer_, | 156 &initiator_observer_, |
| 152 this)), | 157 this)), |
| 153 min_size_(min_size), | 158 min_size_(min_size), |
| 154 max_size_(max_size) { | 159 max_size_(max_size), |
| 160 independent_bounds_(independent_bounds){ |
| 155 SetWebContents(GetWebContents()); | 161 SetWebContents(GetWebContents()); |
| 156 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); | 162 AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); |
| 157 if (!max_size_.IsEmpty()) | 163 if (!max_size_.IsEmpty()) |
| 158 EnableAutoResize(); | 164 EnableAutoResize(); |
| 159 } | 165 } |
| 160 ~ConstrainedWebDialogDelegateViewViews() override {} | 166 ~ConstrainedWebDialogDelegateViewViews() override {} |
| 161 | 167 |
| 162 // ConstrainedWebDialogDelegate: | 168 // ConstrainedWebDialogDelegate: |
| 163 const ui::WebDialogDelegate* GetWebDialogDelegate() const override { | 169 const ui::WebDialogDelegate* GetWebDialogDelegate() const override { |
| 164 return impl_->GetWebDialogDelegate(); | 170 return impl_->GetWebDialogDelegate(); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 GetWebDialogDelegate()->GetDialogSize(&size); | 226 GetWebDialogDelegate()->GetDialogSize(&size); |
| 221 } | 227 } |
| 222 return size; | 228 return size; |
| 223 } | 229 } |
| 224 gfx::Size GetMinimumSize() const override { | 230 gfx::Size GetMinimumSize() const override { |
| 225 return min_size_; | 231 return min_size_; |
| 226 } | 232 } |
| 227 gfx::Size GetMaximumSize() const override { | 233 gfx::Size GetMaximumSize() const override { |
| 228 return !max_size_.IsEmpty() ? max_size_ : WebView::GetMaximumSize(); | 234 return !max_size_.IsEmpty() ? max_size_ : WebView::GetMaximumSize(); |
| 229 } | 235 } |
| 236 bool * GetIndependentBounds() { |
| 237 return &independent_bounds_; |
| 238 } |
| 230 void RenderViewCreated(content::RenderViewHost* render_view_host) override { | 239 void RenderViewCreated(content::RenderViewHost* render_view_host) override { |
| 231 if (!max_size_.IsEmpty()) | 240 if (!max_size_.IsEmpty()) |
| 232 EnableAutoResize(); | 241 EnableAutoResize(); |
| 233 } | 242 } |
| 234 void RenderViewHostChanged(content::RenderViewHost* old_host, | 243 void RenderViewHostChanged(content::RenderViewHost* old_host, |
| 235 content::RenderViewHost* new_host) override { | 244 content::RenderViewHost* new_host) override { |
| 236 if (!max_size_.IsEmpty()) | 245 if (!max_size_.IsEmpty()) |
| 237 EnableAutoResize(); | 246 EnableAutoResize(); |
| 238 } | 247 } |
| 239 void DocumentOnLoadCompletedInMainFrame() override { | 248 void DocumentOnLoadCompletedInMainFrame() override { |
| 240 if (!max_size_.IsEmpty() && initiator_observer_.web_contents()) { | 249 if (!max_size_.IsEmpty() && initiator_observer_.web_contents()) { |
| 241 web_modal::WebContentsModalDialogManager::FromWebContents( | 250 web_modal::WebContentsModalDialogManager::FromWebContents( |
| 242 initiator_observer_.web_contents()) | 251 initiator_observer_.web_contents()) |
| 243 ->ShowModalDialog(GetWidget()->GetNativeWindow()); | 252 ->ShowModalDialog(GetWidget()->GetNativeWindow(), |
| 253 GetIndependentBounds(), |
| 254 constrained_window::kHasIndependentBoundsKey); |
| 244 } | 255 } |
| 245 } | 256 } |
| 246 | 257 |
| 247 private: | 258 private: |
| 248 void EnableAutoResize() { | 259 void EnableAutoResize() { |
| 249 content::RenderViewHost* render_view_host = | 260 content::RenderViewHost* render_view_host = |
| 250 GetWebContents()->GetRenderViewHost(); | 261 GetWebContents()->GetRenderViewHost(); |
| 251 render_view_host->EnableAutoResize(min_size_, max_size_); | 262 render_view_host->EnableAutoResize(min_size_, max_size_); |
| 252 } | 263 } |
| 253 | 264 |
| 254 InitiatorWebContentsObserver initiator_observer_; | 265 InitiatorWebContentsObserver initiator_observer_; |
| 255 | 266 |
| 256 std::unique_ptr<ConstrainedWebDialogDelegateViews> impl_; | 267 std::unique_ptr<ConstrainedWebDialogDelegateViews> impl_; |
| 257 | 268 |
| 258 // Minimum and maximum sizes to determine dialog bounds for auto-resizing. | 269 // Minimum and maximum sizes to determine dialog bounds for auto-resizing. |
| 259 const gfx::Size min_size_; | 270 const gfx::Size min_size_; |
| 260 const gfx::Size max_size_; | 271 const gfx::Size max_size_; |
| 272 bool independent_bounds_; |
| 261 | 273 |
| 262 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewViews); | 274 DISALLOW_COPY_AND_ASSIGN(ConstrainedWebDialogDelegateViewViews); |
| 263 }; | 275 }; |
| 264 | 276 |
| 265 } // namespace | 277 } // namespace |
| 266 | 278 |
| 267 ConstrainedWebDialogDelegate* ShowConstrainedWebDialog( | 279 ConstrainedWebDialogDelegate* ShowConstrainedWebDialog( |
| 268 content::BrowserContext* browser_context, | 280 content::BrowserContext* browser_context, |
| 269 ui::WebDialogDelegate* delegate, | 281 ui::WebDialogDelegate* delegate, |
| 270 content::WebContents* web_contents) { | 282 content::WebContents* web_contents) { |
| 271 ConstrainedWebDialogDelegateViewViews* dialog = | 283 ConstrainedWebDialogDelegateViewViews* dialog = |
| 272 new ConstrainedWebDialogDelegateViewViews( | 284 new ConstrainedWebDialogDelegateViewViews( |
| 273 browser_context, delegate, web_contents, | 285 browser_context, delegate, web_contents, |
| 274 gfx::Size(), gfx::Size()); | 286 gfx::Size(), gfx::Size(), false); |
| 275 constrained_window::ShowWebModalDialogViews(dialog, web_contents); | 287 constrained_window::ShowWebModalDialogViews(dialog, web_contents); |
| 276 return dialog; | 288 return dialog; |
| 277 } | 289 } |
| 278 | 290 |
| 291 ConstrainedWebDialogDelegate* ShowTopLevelConstrainedWebDialog( |
| 292 content::BrowserContext* browser_context, |
| 293 ui::WebDialogDelegate* delegate, |
| 294 content::WebContents* web_contents) { |
| 295 // This doesn't work on Linux desktop or windows classic themes. |
| 296 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| 297 return ShowConstrainedWebDialog(browser_context, delegate, web_contents); |
| 298 #elif defined(OS_WIN) |
| 299 if (!ui::win::IsAeroGlassEnabled()) |
| 300 return ShowConstrainedWebDialog(browser_context, delegate, web_contents); |
| 301 #endif |
| 302 |
| 303 ConstrainedWebDialogDelegateViewViews* dialog = |
| 304 new ConstrainedWebDialogDelegateViewViews( |
| 305 browser_context, delegate, web_contents, |
| 306 gfx::Size(), gfx::Size(), true); |
| 307 constrained_window::ShowWebModalDialogWithIndBoundsViews(dialog, |
| 308 web_contents, dialog->GetIndependentBounds()); |
| 309 return dialog; |
| 310 } |
| 311 |
| 279 ConstrainedWebDialogDelegate* ShowConstrainedWebDialogWithAutoResize( | 312 ConstrainedWebDialogDelegate* ShowConstrainedWebDialogWithAutoResize( |
| 280 content::BrowserContext* browser_context, | 313 content::BrowserContext* browser_context, |
| 281 ui::WebDialogDelegate* delegate, | 314 ui::WebDialogDelegate* delegate, |
| 282 content::WebContents* web_contents, | 315 content::WebContents* web_contents, |
| 283 const gfx::Size& min_size, | 316 const gfx::Size& min_size, |
| 284 const gfx::Size& max_size) { | 317 const gfx::Size& max_size) { |
| 285 DCHECK(!min_size.IsEmpty()); | 318 DCHECK(!min_size.IsEmpty()); |
| 286 DCHECK(!max_size.IsEmpty()); | 319 DCHECK(!max_size.IsEmpty()); |
| 287 ConstrainedWebDialogDelegateViewViews* dialog = | 320 ConstrainedWebDialogDelegateViewViews* dialog = |
| 288 new ConstrainedWebDialogDelegateViewViews( | 321 new ConstrainedWebDialogDelegateViewViews( |
| 289 browser_context, delegate, web_contents, | 322 browser_context, delegate, web_contents, |
| 290 min_size, max_size); | 323 min_size, max_size, false); |
| 291 constrained_window::CreateWebModalDialogViews(dialog, web_contents); | 324 constrained_window::CreateWebModalDialogViews(dialog, web_contents); |
| 292 return dialog; | 325 return dialog; |
| 293 } | 326 } |
| OLD | NEW |