Home | History | Annotate | Download | only in browser
      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 
     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 
     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 
    104 ShellJavaScriptDialog::~ShellJavaScriptDialog() {
    105   Cancel();
    106 }
    107 
    108 void ShellJavaScriptDialog::Cancel() {
    109   if (dialog_win_)
    110     DestroyWindow(dialog_win_);
    111 }
    112 
    113 }  // namespace content
    114