diff options
Diffstat (limited to 'content/shell/shell_javascript_dialog_win.cc')
-rwxr-xr-x | content/shell/shell_javascript_dialog_win.cc | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/content/shell/shell_javascript_dialog_win.cc b/content/shell/shell_javascript_dialog_win.cc new file mode 100755 index 0000000..7195ba5 --- /dev/null +++ b/content/shell/shell_javascript_dialog_win.cc @@ -0,0 +1,111 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/shell/shell_javascript_dialog.h" + +#include "base/string_util.h" +#include "content/shell/resource.h" +#include "content/shell/shell.h" +#include "content/shell/shell_javascript_dialog_creator.h" + +namespace content { + +class ShellJavaScriptDialog; + +INT_PTR CALLBACK ShellJavaScriptDialog::DialogProc(HWND dialog, UINT message, + WPARAM wparam, + LPARAM lparam) { + switch (message) { + case WM_INITDIALOG: { + SetWindowLongPtr(dialog, DWL_USER, static_cast<LONG_PTR>(lparam)); + ShellJavaScriptDialog* owner = + reinterpret_cast<ShellJavaScriptDialog*>(lparam); + owner->dialog_win_ = dialog; + SetDlgItemText(dialog, IDC_DIALOGTEXT, owner->message_text_.c_str()); + if (owner->message_type_ == ui::JAVASCRIPT_MESSAGE_TYPE_PROMPT) + SetDlgItemText(dialog, IDC_PROMPTEDIT, + owner->default_prompt_text_.c_str()); + break; + } + case WM_DESTROY: { + ShellJavaScriptDialog* owner = reinterpret_cast<ShellJavaScriptDialog*>( + GetWindowLongPtr(dialog, DWL_USER)); + if (owner->dialog_win_) { + owner->dialog_win_ = 0; + owner->callback_.Run(false, string16()); + owner->creator_->DialogClosed(owner); + } + break; + } + case WM_COMMAND: { + ShellJavaScriptDialog* owner = reinterpret_cast<ShellJavaScriptDialog*>( + GetWindowLongPtr(dialog, DWL_USER)); + string16 user_input; + bool finish = false; + bool result; + switch (LOWORD(wparam)) { + case IDOK: + finish = true; + result = true; + if (owner->message_type_ == ui::JAVASCRIPT_MESSAGE_TYPE_PROMPT) { + size_t length = + GetWindowTextLength(GetDlgItem(dialog, IDC_PROMPTEDIT)) + 1; + GetDlgItemText(dialog, IDC_PROMPTEDIT, + WriteInto(&user_input, length), length); + } + break; + case IDCANCEL: + finish = true; + result = false; + break; + } + if (finish) { + owner->dialog_win_ = 0; + owner->callback_.Run(result, user_input); + DestroyWindow(dialog); + owner->creator_->DialogClosed(owner); + } + break; + } + default: + return DefWindowProc(dialog, message, wparam, lparam); + } + return 0; +} + +ShellJavaScriptDialog::ShellJavaScriptDialog( + ShellJavaScriptDialogCreator* creator, + ui::JavascriptMessageType javascript_message_type, + const string16& message_text, + const string16& default_prompt_text, + const JavaScriptDialogCreator::DialogClosedCallback& callback) + : creator_(creator), + callback_(callback), + message_text_(message_text), + default_prompt_text_(default_prompt_text), + message_type_(javascript_message_type) { + int dialog_type; + if (javascript_message_type == ui::JAVASCRIPT_MESSAGE_TYPE_ALERT) + dialog_type = IDD_ALERT; + else if (javascript_message_type == ui::JAVASCRIPT_MESSAGE_TYPE_CONFIRM) + dialog_type = IDD_CONFIRM; + else // JAVASCRIPT_MESSAGE_TYPE_PROMPT + dialog_type = IDD_PROMPT; + + dialog_win_ = CreateDialogParam(GetModuleHandle(0), + MAKEINTRESOURCE(dialog_type), 0, DialogProc, + reinterpret_cast<LPARAM>(this)); + ShowWindow(dialog_win_, SW_SHOWNORMAL); +} + +ShellJavaScriptDialog::~ShellJavaScriptDialog() { + Cancel(); +} + +void ShellJavaScriptDialog::Cancel() { + if (dialog_win_) + DestroyWindow(dialog_win_); +} + +} // namespace content |