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

Unified Diff: chrome/browser/ui/cocoa/web_intent_picker_cocoa.mm

Issue 9581041: Make web intents picker work as constrained dialog instead of InfoBubble (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed unneeded code Created 8 years, 9 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/cocoa/web_intent_picker_cocoa.mm
diff --git a/chrome/browser/ui/cocoa/web_intent_picker_cocoa.mm b/chrome/browser/ui/cocoa/web_intent_picker_cocoa.mm
index 2aab61a1e29ede1fa76753d8c9402f6260111456..cf3120f8cb54c7f33ec8b9104a325d982b645f71 100644
--- a/chrome/browser/ui/cocoa/web_intent_picker_cocoa.mm
+++ b/chrome/browser/ui/cocoa/web_intent_picker_cocoa.mm
@@ -12,8 +12,9 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#import "chrome/browser/ui/cocoa/browser_window_controller.h"
+#include "chrome/browser/ui/cocoa/constrained_window_mac.h"
#import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
-#import "chrome/browser/ui/cocoa/web_intent_bubble_controller.h"
+#import "chrome/browser/ui/cocoa/web_intent_sheet_controller.h"
#include "chrome/browser/ui/intents/web_intent_inline_disposition_delegate.h"
#include "chrome/browser/ui/intents/web_intent_picker.h"
#include "chrome/browser/ui/intents/web_intent_picker_delegate.h"
@@ -24,6 +25,48 @@
using content::WebContents;
+namespace {
+
+// Since any delegates for constrained windows are tasked with deleting
+// themselves, and the WebIntentPicker needs to live longer than the
+// constrained window, we need this forwarding class.
+class ConstrainedPickerSheetDelegate :
+ public ConstrainedWindowMacDelegateCustomSheet {
+ public:
+ ConstrainedPickerSheetDelegate(
+ WebIntentPickerCocoa* picker,
+ WebIntentPickerSheetController* sheet_controller);
+ virtual ~ConstrainedPickerSheetDelegate() {}
+
+ // ConstrainedWindowMacDelegateCustomSheet interface
+ virtual void DeleteDelegate() OVERRIDE;
+
+ private:
+ WebIntentPickerCocoa* picker_; // Weak reference to picker
+
+ DISALLOW_COPY_AND_ASSIGN(ConstrainedPickerSheetDelegate);
+};
+
+ConstrainedPickerSheetDelegate::ConstrainedPickerSheetDelegate(
+ WebIntentPickerCocoa* picker,
+ WebIntentPickerSheetController* sheet_controller)
+ : picker_(picker) {
+ init([sheet_controller window], sheet_controller,
+ @selector(sheetDidEnd:returnCode:contextInfo:));
+}
+
+void ConstrainedPickerSheetDelegate::DeleteDelegate() {
+ if (is_sheet_open())
+ [NSApp endSheet:sheet()];
+
+ if (picker_)
+ picker_->OnCancelled();
+
+ delete this;
+}
+
+} // namespace
+
// static
WebIntentPicker* WebIntentPicker::Create(Browser* browser,
TabContentsWrapper* wrapper,
@@ -36,39 +79,32 @@ WebIntentPickerCocoa::WebIntentPickerCocoa()
: delegate_(NULL),
model_(NULL),
browser_(NULL),
- controller_(nil),
- weak_ptr_factory_(this),
+ sheet_controller_(nil),
service_invoked(false) {
}
-
WebIntentPickerCocoa::WebIntentPickerCocoa(Browser* browser,
TabContentsWrapper* wrapper,
WebIntentPickerDelegate* delegate,
WebIntentPickerModel* model)
- : delegate_(delegate),
- model_(model),
- browser_(browser),
- controller_(nil),
- weak_ptr_factory_(this),
- service_invoked(false) {
+ : delegate_(delegate),
+ model_(model),
+ browser_(browser),
+ sheet_controller_(nil),
+ service_invoked(false) {
model_->set_observer(this);
- DCHECK(browser);
DCHECK(delegate);
- NSWindow* parentWindow = browser->window()->GetNativeHandle();
-
- // Compute the anchor point, relative to location bar.
- BrowserWindowController* controller = [parentWindow windowController];
- LocationBarViewMac* locationBar = [controller locationBarBridge];
- NSPoint anchor = locationBar->GetPageInfoBubblePoint();
- anchor = [browser->window()->GetNativeHandle() convertBaseToScreen:anchor];
-
- // The controller is deallocated when the window is closed, so no need to
- // worry about it here.
- [[WebIntentBubbleController alloc] initWithPicker:this
- parentWindow:parentWindow
- anchoredAt:anchor];
+ DCHECK(wrapper);
+
+ sheet_controller_ = [
+ [WebIntentPickerSheetController alloc] initWithPicker:this];
+
+ // Deleted when ConstrainedPickerSheetDelegate::DeleteDelegate() runs.
+ ConstrainedPickerSheetDelegate* constrained_delegate =
+ new ConstrainedPickerSheetDelegate(this, sheet_controller_);
+
+ window_ = new ConstrainedWindowMac(wrapper, constrained_delegate);
}
WebIntentPickerCocoa::~WebIntentPickerCocoa() {
@@ -76,50 +112,38 @@ WebIntentPickerCocoa::~WebIntentPickerCocoa() {
model_->set_observer(NULL);
}
+void WebIntentPickerCocoa::OnSheetDidEnd(NSWindow* sheet) {
+ [sheet orderOut:sheet_controller_];
+ if (window_)
+ window_->CloseConstrainedWindow();
+}
+
void WebIntentPickerCocoa::Close() {
- DCHECK(controller_);
- [controller_ close];
+ DCHECK(sheet_controller_);
+ [sheet_controller_ closeSheet];
+
if (inline_disposition_tab_contents_.get())
inline_disposition_tab_contents_->web_contents()->OnCloseStarted();
}
-void WebIntentPickerCocoa::PerformDelayedLayout() {
- // Check to see if a layout has already been scheduled.
- if (weak_ptr_factory_.HasWeakPtrs())
- return;
-
- // Delay performing layout by a second so that all the animations from
- // InfoBubbleWindow and origin updates from BaseBubbleController finish, so
- // that we don't all race trying to change the frame's origin.
- //
- // Using MessageLoop is superior here to |-performSelector:| because it will
- // not retain its target; if the child outlives its parent, zombies get left
- // behind (http://crbug.com/59619). This will cancel the scheduled task if
- // the controller get destroyed before the message
- // can be delivered.
- MessageLoop::current()->PostDelayedTask(FROM_HERE,
- base::Bind(&WebIntentPickerCocoa::PerformLayout,
- weak_ptr_factory_.GetWeakPtr()),
- 100 /* milliseconds */);
-}
-
void WebIntentPickerCocoa::PerformLayout() {
- DCHECK(controller_);
+ DCHECK(sheet_controller_);
// If the window is animating closed when this is called, the
// animation could be holding the last reference to |controller_|
// (and thus |this|). Pin it until the task is completed.
- scoped_nsobject<WebIntentBubbleController> keep_alive([controller_ retain]);
- [controller_ performLayoutWithModel:model_];
+ scoped_nsobject<WebIntentPickerSheetController>
+ keep_alive([sheet_controller_ retain]);
+ [sheet_controller_ performLayoutWithModel:model_];
}
void WebIntentPickerCocoa::OnModelChanged(WebIntentPickerModel* model) {
- PerformDelayedLayout();
+ PerformLayout();
}
void WebIntentPickerCocoa::OnFaviconChanged(WebIntentPickerModel* model,
size_t index) {
// We don't handle individual icon changes - just redo the whole model.
- PerformDelayedLayout();
+ PerformLayout();
}
void WebIntentPickerCocoa::OnExtensionIconChanged(
@@ -129,6 +153,7 @@ void WebIntentPickerCocoa::OnExtensionIconChanged(
}
void WebIntentPickerCocoa::OnInlineDisposition(WebIntentPickerModel* model) {
+ DCHECK(browser_);
const WebIntentPickerModel::InstalledService& installed_service =
model->GetInstalledServiceAt(model->inline_disposition_index());
@@ -148,9 +173,9 @@ void WebIntentPickerCocoa::OnInlineDisposition(WebIntentPickerModel* model) {
content::PAGE_TRANSITION_START_PAGE,
std::string());
- [controller_ setInlineDispositionTabContents:
+ [sheet_controller_ setInlineDispositionTabContents:
inline_disposition_tab_contents_.get()];
- PerformDelayedLayout();
+ PerformLayout();
}
void WebIntentPickerCocoa::OnCancelled() {
@@ -169,7 +194,3 @@ void WebIntentPickerCocoa::OnServiceChosen(size_t index) {
delegate_->OnServiceChosen(index, installed_service.disposition);
}
-void WebIntentPickerCocoa::set_controller(
- WebIntentBubbleController* controller) {
- controller_ = controller;
-}
« no previous file with comments | « chrome/browser/ui/cocoa/web_intent_picker_cocoa.h ('k') | chrome/browser/ui/cocoa/web_intent_sheet_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698