| Index: chrome/browser/ui/cocoa/web_dialog_window_controller.mm
|
| diff --git a/chrome/browser/ui/cocoa/web_dialog_window_controller.mm b/chrome/browser/ui/cocoa/web_dialog_window_controller.mm
|
| deleted file mode 100644
|
| index e9dd1348f4c23a4e0d8496e1d219cfa0045d0b82..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/cocoa/web_dialog_window_controller.mm
|
| +++ /dev/null
|
| @@ -1,350 +0,0 @@
|
| -// 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.
|
| -
|
| -#import "chrome/browser/ui/cocoa/web_dialog_window_controller.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/mac/scoped_nsobject.h"
|
| -#include "base/macros.h"
|
| -#include "base/strings/sys_string_conversions.h"
|
| -#import "chrome/browser/ui/browser_dialogs.h"
|
| -#import "chrome/browser/ui/cocoa/chrome_event_processing_window.h"
|
| -#include "chrome/browser/ui/webui/chrome_web_contents_handler.h"
|
| -#include "content/public/browser/native_web_keyboard_event.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "content/public/browser/web_ui_message_handler.h"
|
| -#include "ui/events/keycodes/keyboard_codes.h"
|
| -#include "ui/gfx/geometry/size.h"
|
| -#include "ui/web_dialogs/web_dialog_delegate.h"
|
| -#include "ui/web_dialogs/web_dialog_web_contents_delegate.h"
|
| -
|
| -using content::NativeWebKeyboardEvent;
|
| -using content::WebContents;
|
| -using content::WebUIMessageHandler;
|
| -using ui::WebDialogDelegate;
|
| -using ui::WebDialogUI;
|
| -using ui::WebDialogWebContentsDelegate;
|
| -
|
| -// Thin bridge that routes notifications to
|
| -// WebDialogWindowController's member variables.
|
| -class WebDialogWindowDelegateBridge
|
| - : public WebDialogDelegate,
|
| - public WebDialogWebContentsDelegate {
|
| -public:
|
| - // All parameters must be non-NULL/non-nil.
|
| - WebDialogWindowDelegateBridge(WebDialogWindowController* controller,
|
| - content::BrowserContext* context,
|
| - WebDialogDelegate* delegate);
|
| -
|
| - ~WebDialogWindowDelegateBridge() override;
|
| -
|
| - // Called when the window is directly closed, e.g. from the close
|
| - // button or from an accelerator.
|
| - void WindowControllerClosed();
|
| -
|
| - // WebDialogDelegate declarations.
|
| - ui::ModalType GetDialogModalType() const override;
|
| - base::string16 GetDialogTitle() const override;
|
| - GURL GetDialogContentURL() const override;
|
| - void GetWebUIMessageHandlers(
|
| - std::vector<WebUIMessageHandler*>* handlers) const override;
|
| - void GetDialogSize(gfx::Size* size) const override;
|
| - void GetMinimumDialogSize(gfx::Size* size) const override;
|
| - std::string GetDialogArgs() const override;
|
| - void OnDialogClosed(const std::string& json_retval) override;
|
| - void OnCloseContents(WebContents* source, bool* out_close_dialog) override;
|
| - bool ShouldShowDialogTitle() const override { return true; }
|
| -
|
| - // WebDialogWebContentsDelegate declarations.
|
| - void MoveContents(WebContents* source, const gfx::Rect& pos) override;
|
| - void HandleKeyboardEvent(content::WebContents* source,
|
| - const NativeWebKeyboardEvent& event) override;
|
| - void CloseContents(WebContents* source) override;
|
| - content::WebContents* OpenURLFromTab(
|
| - content::WebContents* source,
|
| - const content::OpenURLParams& params) override;
|
| - void AddNewContents(content::WebContents* source,
|
| - content::WebContents* new_contents,
|
| - WindowOpenDisposition disposition,
|
| - const gfx::Rect& initial_rect,
|
| - bool user_gesture,
|
| - bool* was_blocked) override;
|
| - void LoadingStateChanged(content::WebContents* source,
|
| - bool to_different_document) override;
|
| -
|
| -private:
|
| - WebDialogWindowController* controller_; // weak
|
| - WebDialogDelegate* delegate_; // weak, owned by controller_
|
| -
|
| - // Calls delegate_'s OnDialogClosed() exactly once, nulling it out afterwards
|
| - // so that no other WebDialogDelegate calls are sent to it. Returns whether or
|
| - // not the OnDialogClosed() was actually called on the delegate.
|
| - bool DelegateOnDialogClosed(const std::string& json_retval);
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(WebDialogWindowDelegateBridge);
|
| -};
|
| -
|
| -namespace chrome {
|
| -
|
| -gfx::NativeWindow ShowWebDialog(gfx::NativeView parent,
|
| - content::BrowserContext* context,
|
| - WebDialogDelegate* delegate) {
|
| - return [WebDialogWindowController showWebDialog:delegate
|
| - context:context];
|
| -}
|
| -
|
| -} // namespace chrome
|
| -
|
| -WebDialogWindowDelegateBridge::WebDialogWindowDelegateBridge(
|
| - WebDialogWindowController* controller,
|
| - content::BrowserContext* context,
|
| - WebDialogDelegate* delegate)
|
| - : WebDialogWebContentsDelegate(context, new ChromeWebContentsHandler),
|
| - controller_(controller),
|
| - delegate_(delegate) {
|
| - DCHECK(controller_);
|
| - DCHECK(delegate_);
|
| -}
|
| -
|
| -WebDialogWindowDelegateBridge::~WebDialogWindowDelegateBridge() {}
|
| -
|
| -void WebDialogWindowDelegateBridge::WindowControllerClosed() {
|
| - Detach();
|
| - controller_ = nil;
|
| - DelegateOnDialogClosed("");
|
| -}
|
| -
|
| -bool WebDialogWindowDelegateBridge::DelegateOnDialogClosed(
|
| - const std::string& json_retval) {
|
| - if (delegate_) {
|
| - WebDialogDelegate* real_delegate = delegate_;
|
| - delegate_ = NULL;
|
| - real_delegate->OnDialogClosed(json_retval);
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -// WebDialogDelegate definitions.
|
| -
|
| -// All of these functions check for NULL first since delegate_ is set
|
| -// to NULL when the window is closed.
|
| -
|
| -ui::ModalType WebDialogWindowDelegateBridge::GetDialogModalType() const {
|
| - // TODO(akalin): Support modal dialog boxes.
|
| - if (delegate_ && delegate_->GetDialogModalType() != ui::MODAL_TYPE_NONE) {
|
| - LOG(WARNING) << "Modal Web dialogs are not supported yet";
|
| - }
|
| - return ui::MODAL_TYPE_NONE;
|
| -}
|
| -
|
| -base::string16 WebDialogWindowDelegateBridge::GetDialogTitle() const {
|
| - return delegate_ ? delegate_->GetDialogTitle() : base::string16();
|
| -}
|
| -
|
| -GURL WebDialogWindowDelegateBridge::GetDialogContentURL() const {
|
| - return delegate_ ? delegate_->GetDialogContentURL() : GURL();
|
| -}
|
| -
|
| -void WebDialogWindowDelegateBridge::GetWebUIMessageHandlers(
|
| - std::vector<WebUIMessageHandler*>* handlers) const {
|
| - if (delegate_) {
|
| - delegate_->GetWebUIMessageHandlers(handlers);
|
| - } else {
|
| - // TODO(akalin): Add this clause in the windows version. Also
|
| - // make sure that everything expects handlers to be non-NULL and
|
| - // document it.
|
| - handlers->clear();
|
| - }
|
| -}
|
| -
|
| -void WebDialogWindowDelegateBridge::GetDialogSize(gfx::Size* size) const {
|
| - if (delegate_)
|
| - delegate_->GetDialogSize(size);
|
| - else
|
| - *size = gfx::Size();
|
| -}
|
| -
|
| -void WebDialogWindowDelegateBridge::GetMinimumDialogSize(
|
| - gfx::Size* size) const {
|
| - if (delegate_)
|
| - delegate_->GetMinimumDialogSize(size);
|
| - else
|
| - *size = gfx::Size();
|
| -}
|
| -
|
| -std::string WebDialogWindowDelegateBridge::GetDialogArgs() const {
|
| - return delegate_ ? delegate_->GetDialogArgs() : "";
|
| -}
|
| -
|
| -void WebDialogWindowDelegateBridge::OnDialogClosed(
|
| - const std::string& json_retval) {
|
| - Detach();
|
| - // [controller_ close] should be called at most once, too.
|
| - if (DelegateOnDialogClosed(json_retval)) {
|
| - [controller_ close];
|
| - }
|
| - controller_ = nil;
|
| -}
|
| -
|
| -void WebDialogWindowDelegateBridge::OnCloseContents(WebContents* source,
|
| - bool* out_close_dialog) {
|
| - *out_close_dialog = true;
|
| -}
|
| -
|
| -void WebDialogWindowDelegateBridge::CloseContents(WebContents* source) {
|
| - bool close_dialog = false;
|
| - OnCloseContents(source, &close_dialog);
|
| - if (close_dialog)
|
| - OnDialogClosed(std::string());
|
| -}
|
| -
|
| -content::WebContents* WebDialogWindowDelegateBridge::OpenURLFromTab(
|
| - content::WebContents* source,
|
| - const content::OpenURLParams& params) {
|
| - content::WebContents* new_contents = NULL;
|
| - if (delegate_ &&
|
| - delegate_->HandleOpenURLFromTab(source, params, &new_contents)) {
|
| - return new_contents;
|
| - }
|
| - return WebDialogWebContentsDelegate::OpenURLFromTab(source, params);
|
| -}
|
| -
|
| -void WebDialogWindowDelegateBridge::AddNewContents(
|
| - content::WebContents* source,
|
| - content::WebContents* new_contents,
|
| - WindowOpenDisposition disposition,
|
| - const gfx::Rect& initial_rect,
|
| - bool user_gesture,
|
| - bool* was_blocked) {
|
| - if (delegate_ && delegate_->HandleAddNewContents(
|
| - source, new_contents, disposition, initial_rect, user_gesture)) {
|
| - return;
|
| - }
|
| - WebDialogWebContentsDelegate::AddNewContents(
|
| - source, new_contents, disposition, initial_rect, user_gesture,
|
| - was_blocked);
|
| -}
|
| -
|
| -void WebDialogWindowDelegateBridge::LoadingStateChanged(
|
| - content::WebContents* source, bool to_different_document) {
|
| - if (delegate_)
|
| - delegate_->OnLoadingStateChanged(source);
|
| -}
|
| -
|
| -void WebDialogWindowDelegateBridge::MoveContents(WebContents* source,
|
| - const gfx::Rect& pos) {
|
| - // TODO(akalin): Actually set the window bounds.
|
| -}
|
| -
|
| -// A simplified version of BrowserWindowCocoa::HandleKeyboardEvent().
|
| -// We don't handle global keyboard shortcuts here, but that's fine since
|
| -// they're all browser-specific. (This may change in the future.)
|
| -void WebDialogWindowDelegateBridge::HandleKeyboardEvent(
|
| - content::WebContents* source,
|
| - const NativeWebKeyboardEvent& event) {
|
| - if (event.skip_in_browser || event.type == NativeWebKeyboardEvent::Char)
|
| - return;
|
| -
|
| - // Close ourselves if the user hits Esc or Command-. . The normal
|
| - // way to do this is to implement (void)cancel:(int)sender, but
|
| - // since we handle keyboard events ourselves we can't do that.
|
| - //
|
| - // According to experiments, hitting Esc works regardless of the
|
| - // presence of other modifiers (as long as it's not an app-level
|
| - // shortcut, e.g. Commmand-Esc for Front Row) but no other modifiers
|
| - // can be present for Command-. to work.
|
| - //
|
| - // TODO(thakis): It would be nice to get cancel: to work somehow.
|
| - // Bug: http://code.google.com/p/chromium/issues/detail?id=32828 .
|
| - if (event.type == NativeWebKeyboardEvent::RawKeyDown &&
|
| - ((event.windowsKeyCode == ui::VKEY_ESCAPE) ||
|
| - (event.windowsKeyCode == ui::VKEY_OEM_PERIOD &&
|
| - event.modifiers == NativeWebKeyboardEvent::MetaKey))) {
|
| - [controller_ close];
|
| - return;
|
| - }
|
| -
|
| - ChromeEventProcessingWindow* event_window =
|
| - static_cast<ChromeEventProcessingWindow*>([controller_ window]);
|
| - DCHECK([event_window isKindOfClass:[ChromeEventProcessingWindow class]]);
|
| - [event_window redispatchKeyEvent:event.os_event];
|
| -}
|
| -
|
| -@implementation WebDialogWindowController
|
| -
|
| -// NOTE(akalin): We'll probably have to add the parentWindow parameter back
|
| -// in once we implement modal dialogs.
|
| -
|
| -+ (NSWindow*)showWebDialog:(WebDialogDelegate*)delegate
|
| - context:(content::BrowserContext*)context {
|
| - WebDialogWindowController* webDialogWindowController =
|
| - [[WebDialogWindowController alloc] initWithDelegate:delegate
|
| - context:context];
|
| - [webDialogWindowController loadDialogContents];
|
| - [webDialogWindowController showWindow:nil];
|
| - return [webDialogWindowController window];
|
| -}
|
| -
|
| -- (id)initWithDelegate:(WebDialogDelegate*)delegate
|
| - context:(content::BrowserContext*)context {
|
| - DCHECK(delegate);
|
| - DCHECK(context);
|
| -
|
| - gfx::Size dialogSize;
|
| - delegate->GetDialogSize(&dialogSize);
|
| - NSRect dialogRect = NSMakeRect(0, 0, dialogSize.width(), dialogSize.height());
|
| - NSUInteger style = NSTitledWindowMask | NSClosableWindowMask |
|
| - NSResizableWindowMask;
|
| - base::scoped_nsobject<ChromeEventProcessingWindow> window(
|
| - [[ChromeEventProcessingWindow alloc]
|
| - initWithContentRect:dialogRect
|
| - styleMask:style
|
| - backing:NSBackingStoreBuffered
|
| - defer:NO]);
|
| - if (!window.get()) {
|
| - return nil;
|
| - }
|
| - self = [super initWithWindow:window];
|
| - if (!self) {
|
| - return nil;
|
| - }
|
| - [window setWindowController:self];
|
| - [window setDelegate:self];
|
| - [window setTitle:base::SysUTF16ToNSString(delegate->GetDialogTitle())];
|
| - [window setMinSize:dialogRect.size];
|
| - [window center];
|
| - delegate_.reset(
|
| - new WebDialogWindowDelegateBridge(self, context, delegate));
|
| - return self;
|
| -}
|
| -
|
| -- (void)loadDialogContents {
|
| - webContents_.reset(WebContents::Create(
|
| - WebContents::CreateParams(delegate_->browser_context())));
|
| - [[self window] setContentView:webContents_->GetNativeView()];
|
| - webContents_->SetDelegate(delegate_.get());
|
| -
|
| - // This must be done before loading the page; see the comments in
|
| - // WebDialogUI.
|
| - WebDialogUI::SetDelegate(webContents_.get(), delegate_.get());
|
| -
|
| - webContents_->GetController().LoadURL(
|
| - delegate_->GetDialogContentURL(),
|
| - content::Referrer(),
|
| - ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
|
| - std::string());
|
| -
|
| - // TODO(akalin): add accelerator for ESC to close the dialog box.
|
| - //
|
| - // TODO(akalin): Figure out why implementing (void)cancel:(id)sender
|
| - // to do the above doesn't work.
|
| -}
|
| -
|
| -- (void)windowWillClose:(NSNotification*)notification {
|
| - delegate_->WindowControllerClosed();
|
| - [self autorelease];
|
| -}
|
| -
|
| -@end
|
|
|