Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(129)

Unified Diff: chrome/browser/ui/javascript_dialogs/javascript_dialog_cocoa.mm

Issue 2450173003: Add a Cocoa version of the auto-dismissing dialog. (Closed)
Patch Set: rsesek Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/javascript_dialogs/javascript_dialog_cocoa.mm
diff --git a/chrome/browser/ui/javascript_dialogs/javascript_dialog_cocoa.mm b/chrome/browser/ui/javascript_dialogs/javascript_dialog_cocoa.mm
new file mode 100644
index 0000000000000000000000000000000000000000..ece29c7d01bb02fcf98f09193666f00b8f8c6249
--- /dev/null
+++ b/chrome/browser/ui/javascript_dialogs/javascript_dialog_cocoa.mm
@@ -0,0 +1,189 @@
+// Copyright 2016 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 "chrome/browser/ui/javascript_dialogs/javascript_dialog_cocoa.h"
+
+#import "base/mac/scoped_nsobject.h"
+#include "base/memory/ptr_util.h"
+#include "base/strings/sys_string_conversions.h"
+#import "chrome/browser/ui/cocoa/constrained_window/constrained_window_alert.h"
+#import "chrome/browser/ui/cocoa/constrained_window/constrained_window_custom_sheet.h"
+#import "chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.h"
+#import "chrome/browser/ui/cocoa/key_equivalent_constants.h"
+#include "ui/base/l10n/l10n_util_mac.h"
+#include "ui/strings/grit/ui_strings.h"
+
+@class JavaScriptDialogCocoaBridge;
+
+class JavaScriptDialogCocoa::JavaScriptDialogCocoaImpl
+ : public ConstrainedWindowMacDelegate {
+ public:
+ JavaScriptDialogCocoaImpl(
+ JavaScriptDialogCocoa* parent,
+ content::WebContents* parent_web_contents,
+ content::WebContents* alerting_web_contents,
+ const base::string16& title,
+ content::JavaScriptMessageType message_type,
+ const base::string16& message_text,
+ const base::string16& default_prompt_text,
+ const content::JavaScriptDialogManager::DialogClosedCallback&
+ dialog_callback);
+ virtual ~JavaScriptDialogCocoaImpl() = default;
+
+ // Callbacks from the bridge when buttons are clicked.
+ void Accept();
+ void Cancel();
+
+ // ConstrainedWindowMacDelegate:
+ void OnConstrainedWindowClosed(ConstrainedWindowMac* window) override;
+
+ private:
+ friend class JavaScriptDialogCocoa;
+
+ content::JavaScriptDialogManager::DialogClosedCallback dialog_callback_;
+
+ std::unique_ptr<ConstrainedWindowMac> window_;
+ base::scoped_nsobject<ConstrainedWindowAlert> alert_;
+ base::scoped_nsobject<JavaScriptDialogCocoaBridge> bridge_;
+
+ base::scoped_nsobject<NSTextField> textField_;
+
+ JavaScriptDialogCocoa* parent_;
+};
+
+@interface JavaScriptDialogCocoaBridge : NSObject {
+ JavaScriptDialogCocoa::JavaScriptDialogCocoaImpl* dialogImpl_; // weak
+}
+@end
+
+@implementation JavaScriptDialogCocoaBridge
+
+- (instancetype)initWithDialogImpl:
+ (JavaScriptDialogCocoa::JavaScriptDialogCocoaImpl*)dialogImpl {
+ if ((self = [super init])) {
+ dialogImpl_ = dialogImpl;
+ }
+ return self;
+}
+
+- (void)onAcceptButton:(id)sender {
+ dialogImpl_->Accept();
+}
+
+- (void)onCancelButton:(id)sender {
+ dialogImpl_->Cancel();
+}
+
+@end
+
+JavaScriptDialogCocoa::JavaScriptDialogCocoaImpl::JavaScriptDialogCocoaImpl(
+ JavaScriptDialogCocoa* parent,
+ content::WebContents* parent_web_contents,
+ content::WebContents* alerting_web_contents,
+ const base::string16& title,
+ content::JavaScriptMessageType message_type,
+ const base::string16& message_text,
+ const base::string16& default_prompt_text,
+ const content::JavaScriptDialogManager::DialogClosedCallback&
+ dialog_callback)
+ : dialog_callback_(dialog_callback), parent_(parent) {
+ bridge_.reset([[JavaScriptDialogCocoaBridge alloc] initWithDialogImpl:this]);
+
+ alert_.reset([[ConstrainedWindowAlert alloc] init]);
+ [alert_ setMessageText:base::SysUTF16ToNSString(title)];
+ [alert_ setInformativeText:base::SysUTF16ToNSString(message_text)];
+ [alert_ addButtonWithTitle:l10n_util::GetNSStringWithFixup(IDS_APP_OK)
+ keyEquivalent:kKeyEquivalentReturn
+ target:bridge_
+ action:@selector(onAcceptButton:)];
+ if (message_type != content::JAVASCRIPT_MESSAGE_TYPE_ALERT) {
+ [alert_ addButtonWithTitle:l10n_util::GetNSStringWithFixup(IDS_APP_CANCEL)
+ keyEquivalent:kKeyEquivalentEscape
+ target:bridge_
+ action:@selector(onCancelButton:)];
+ }
+ if (message_type == content::JAVASCRIPT_MESSAGE_TYPE_PROMPT) {
+ textField_.reset(
+ [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 460, 22)]);
+ [[textField_ cell] setLineBreakMode:NSLineBreakByTruncatingTail];
+ [textField_ setStringValue:base::SysUTF16ToNSString(default_prompt_text)];
+ [alert_ setAccessoryView:textField_];
+ }
+ [[alert_ closeButton] removeFromSuperview];
+ [alert_ layout];
+
+ base::scoped_nsobject<CustomConstrainedWindowSheet> sheet(
+ [[CustomConstrainedWindowSheet alloc]
+ initWithCustomWindow:[alert_ window]]);
+ window_ = CreateAndShowWebModalDialogMac(this, parent_web_contents, sheet);
+}
+
+void JavaScriptDialogCocoa::JavaScriptDialogCocoaImpl::
+ OnConstrainedWindowClosed(ConstrainedWindowMac* window) {
+ if (dialog_callback_)
+ dialog_callback_.Run(false, base::string16());
+ delete parent_;
+ // parent_ owns this object, so return immediately.
+}
+
+void JavaScriptDialogCocoa::JavaScriptDialogCocoaImpl::Cancel() {
+ if (dialog_callback_) {
+ dialog_callback_.Run(false, base::string16());
+ dialog_callback_.Reset();
+ }
+ window_->CloseWebContentsModalDialog();
+}
+
+void JavaScriptDialogCocoa::JavaScriptDialogCocoaImpl::Accept() {
+ if (dialog_callback_) {
+ base::string16 input;
+ if (textField_)
+ input = base::SysNSStringToUTF16([textField_ stringValue]);
+ dialog_callback_.Run(true, input);
+ dialog_callback_.Reset();
+ }
+ window_->CloseWebContentsModalDialog();
+}
+
+JavaScriptDialogCocoa::~JavaScriptDialogCocoa() = default;
+
+// static
+base::WeakPtr<JavaScriptDialogCocoa> JavaScriptDialogCocoa::Create(
+ content::WebContents* parent_web_contents,
+ content::WebContents* alerting_web_contents,
+ const base::string16& title,
+ content::JavaScriptMessageType message_type,
+ const base::string16& message_text,
+ const base::string16& default_prompt_text,
+ const content::JavaScriptDialogManager::DialogClosedCallback&
+ dialog_callback) {
+ return (new JavaScriptDialogCocoa(parent_web_contents, alerting_web_contents,
+ title, message_type, message_text,
+ default_prompt_text, dialog_callback))
+ ->weak_factory_.GetWeakPtr();
+}
+
+void JavaScriptDialogCocoa::CloseDialogWithoutCallback() {
+ impl_->dialog_callback_.Reset();
+ impl_->window_->CloseWebContentsModalDialog();
+}
+
+JavaScriptDialogCocoa::JavaScriptDialogCocoa(
+ content::WebContents* parent_web_contents,
+ content::WebContents* alerting_web_contents,
+ const base::string16& title,
+ content::JavaScriptMessageType message_type,
+ const base::string16& message_text,
+ const base::string16& default_prompt_text,
+ const content::JavaScriptDialogManager::DialogClosedCallback&
+ dialog_callback)
+ : impl_(base::MakeUnique<JavaScriptDialogCocoaImpl>(this,
+ parent_web_contents,
+ alerting_web_contents,
+ title,
+ message_type,
+ message_text,
+ default_prompt_text,
+ dialog_callback)),
+ weak_factory_(this) {}

Powered by Google App Engine
This is Rietveld 408576698