• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "content/shell/browser/shell_javascript_dialog.h"
6 
7 #include "base/strings/string_util.h"
8 #include "content/shell/app/resource.h"
9 #include "content/shell/browser/shell.h"
10 #include "content/shell/browser/shell_javascript_dialog_manager.h"
11 
12 namespace content {
13 
14 class ShellJavaScriptDialog;
15 
DialogProc(HWND dialog,UINT message,WPARAM wparam,LPARAM lparam)16 INT_PTR CALLBACK ShellJavaScriptDialog::DialogProc(HWND dialog,
17                                                    UINT message,
18                                                    WPARAM wparam,
19                                                    LPARAM lparam) {
20   switch (message) {
21     case WM_INITDIALOG: {
22       SetWindowLongPtr(dialog, DWLP_USER, static_cast<LONG_PTR>(lparam));
23       ShellJavaScriptDialog* owner =
24           reinterpret_cast<ShellJavaScriptDialog*>(lparam);
25       owner->dialog_win_ = dialog;
26       SetDlgItemText(dialog, IDC_DIALOGTEXT, owner->message_text_.c_str());
27       if (owner->message_type_ == JAVASCRIPT_MESSAGE_TYPE_PROMPT)
28         SetDlgItemText(dialog, IDC_PROMPTEDIT,
29                        owner->default_prompt_text_.c_str());
30       break;
31     }
32     case WM_DESTROY: {
33       ShellJavaScriptDialog* owner = reinterpret_cast<ShellJavaScriptDialog*>(
34           GetWindowLongPtr(dialog, DWLP_USER));
35       if (owner->dialog_win_) {
36         owner->dialog_win_ = 0;
37         owner->callback_.Run(false, base::string16());
38         owner->manager_->DialogClosed(owner);
39       }
40       break;
41     }
42     case WM_COMMAND: {
43       ShellJavaScriptDialog* owner = reinterpret_cast<ShellJavaScriptDialog*>(
44           GetWindowLongPtr(dialog, DWLP_USER));
45       base::string16 user_input;
46       bool finish = false;
47       bool result;
48       switch (LOWORD(wparam)) {
49         case IDOK:
50           finish = true;
51           result = true;
52           if (owner->message_type_ == JAVASCRIPT_MESSAGE_TYPE_PROMPT) {
53             int length =
54                 GetWindowTextLength(GetDlgItem(dialog, IDC_PROMPTEDIT)) + 1;
55             GetDlgItemText(dialog, IDC_PROMPTEDIT,
56                            WriteInto(&user_input, length), length);
57           }
58           break;
59         case IDCANCEL:
60           finish = true;
61           result = false;
62           break;
63       }
64       if (finish) {
65         owner->dialog_win_ = 0;
66         owner->callback_.Run(result, user_input);
67         DestroyWindow(dialog);
68         owner->manager_->DialogClosed(owner);
69       }
70       break;
71     }
72     default:
73       return DefWindowProc(dialog, message, wparam, lparam);
74   }
75   return 0;
76 }
77 
ShellJavaScriptDialog(ShellJavaScriptDialogManager * manager,gfx::NativeWindow parent_window,JavaScriptMessageType message_type,const base::string16 & message_text,const base::string16 & default_prompt_text,const JavaScriptDialogManager::DialogClosedCallback & callback)78 ShellJavaScriptDialog::ShellJavaScriptDialog(
79     ShellJavaScriptDialogManager* manager,
80     gfx::NativeWindow parent_window,
81     JavaScriptMessageType message_type,
82     const base::string16& message_text,
83     const base::string16& default_prompt_text,
84     const JavaScriptDialogManager::DialogClosedCallback& callback)
85     : manager_(manager),
86       callback_(callback),
87       message_text_(message_text),
88       default_prompt_text_(default_prompt_text),
89       message_type_(message_type) {
90   int dialog_type;
91   if (message_type == JAVASCRIPT_MESSAGE_TYPE_ALERT)
92     dialog_type = IDD_ALERT;
93   else if (message_type == JAVASCRIPT_MESSAGE_TYPE_CONFIRM)
94     dialog_type = IDD_CONFIRM;
95   else // JAVASCRIPT_MESSAGE_TYPE_PROMPT
96     dialog_type = IDD_PROMPT;
97 
98   dialog_win_ = CreateDialogParam(GetModuleHandle(0),
99                                   MAKEINTRESOURCE(dialog_type), 0, DialogProc,
100                                   reinterpret_cast<LPARAM>(this));
101   ShowWindow(dialog_win_, SW_SHOWNORMAL);
102 }
103 
~ShellJavaScriptDialog()104 ShellJavaScriptDialog::~ShellJavaScriptDialog() {
105   Cancel();
106 }
107 
Cancel()108 void ShellJavaScriptDialog::Cancel() {
109   if (dialog_win_)
110     DestroyWindow(dialog_win_);
111 }
112 
113 }  // namespace content
114