1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome_frame/turndown_prompt/turndown_prompt_content.h"
6
7 #include "base/logging.h"
8 #include "chrome_frame/ready_mode/internal/url_launcher.h"
9 #include "chrome_frame/turndown_prompt/turndown_prompt_window.h"
10
TurndownPromptContent(UrlLauncher * url_launcher,const base::Closure & uninstall_closure)11 TurndownPromptContent::TurndownPromptContent(
12 UrlLauncher* url_launcher,
13 const base::Closure& uninstall_closure)
14 : url_launcher_(url_launcher),
15 uninstall_closure_(uninstall_closure) {
16 }
17
~TurndownPromptContent()18 TurndownPromptContent::~TurndownPromptContent() {
19 if (window_ != NULL && window_->IsWindow()) {
20 // The window must discard its ContentFrame pointer at this time.
21 window_->DestroyWindow();
22 window_.reset();
23 }
24 }
25
InstallInFrame(Frame * frame)26 bool TurndownPromptContent::InstallInFrame(Frame* frame) {
27 DCHECK(window_ == NULL);
28 DCHECK(url_launcher_ != NULL);
29
30 // Pass ownership of our url_launcher_ to the window.
31 window_ = TurndownPromptWindow::CreateInstance(
32 frame, url_launcher_.release(), uninstall_closure_);
33 uninstall_closure_.Reset();
34
35 return window_ != NULL;
36 }
37
SetDimensions(const RECT & dimensions)38 void TurndownPromptContent::SetDimensions(const RECT& dimensions) {
39 if (window_ != NULL && window_->IsWindow()) {
40 window_->SetWindowPos(HWND_TOP, &dimensions,
41 ::IsRectEmpty(&dimensions) ? SWP_HIDEWINDOW :
42 SWP_SHOWWINDOW);
43 }
44 }
45
GetDialogTemplateDimensions(TurndownPromptWindow * window,RECT * dimensions)46 bool GetDialogTemplateDimensions(TurndownPromptWindow* window,
47 RECT* dimensions) {
48 HRSRC resource = ::FindResource(_AtlBaseModule.GetResourceInstance(),
49 MAKEINTRESOURCE(TurndownPromptWindow::IDD),
50 RT_DIALOG);
51
52 HGLOBAL handle = NULL;
53 DLGTEMPLATE* dlgtemplate = NULL;
54 _DialogSplitHelper::DLGTEMPLATEEX* dlgtemplateex = NULL;
55
56 if (resource == NULL) {
57 DPLOG(ERROR) << "Failed to find resource for TurndownPromptWindow::IDD";
58 return false;
59 }
60
61 handle = ::LoadResource(_AtlBaseModule.GetResourceInstance(), resource);
62
63 if (handle == NULL) {
64 DPLOG(ERROR) << "Failed to load resource for TurndownPromptWindow::IDD";
65 return false;
66 }
67
68 dlgtemplate = reinterpret_cast<DLGTEMPLATE*>(::LockResource(handle));
69 if (dlgtemplate == NULL) {
70 DPLOG(ERROR) << "Failed to lock resource for TurndownPromptWindow::IDD";
71 return false;
72 }
73
74 if (!_DialogSplitHelper::IsDialogEx(dlgtemplate)) {
75 DLOG(ERROR) << "Resource TurndownPromptWindow::IDD is not a DLGTEMPLATEEX";
76 return false;
77 }
78
79 dlgtemplateex =
80 reinterpret_cast<_DialogSplitHelper::DLGTEMPLATEEX*>(dlgtemplate);
81
82 RECT dlgdimensions = {0, 0, dlgtemplateex->cx, dlgtemplateex->cy};
83 if (!window->MapDialogRect(&dlgdimensions)) {
84 DPLOG(ERROR) << "Failure in MapDialogRect";
85 return false;
86 }
87
88 *dimensions = dlgdimensions;
89 return true;
90 }
91
GetDesiredSize(size_t width,size_t height)92 size_t TurndownPromptContent::GetDesiredSize(size_t width, size_t height) {
93 DCHECK(window_ != NULL && window_->IsWindow());
94
95 if (window_ == NULL || !window_->IsWindow()) {
96 return 0;
97 }
98 RECT dialog_dimensions = {0, 0, 0, 0};
99
100 if (GetDialogTemplateDimensions(window_.get(), &dialog_dimensions))
101 return width == 0 ? dialog_dimensions.right : dialog_dimensions.bottom;
102 else
103 return width == 0 ? 0 : 39;
104 }
105