summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authordmaclach@chromium.org <dmaclach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-26 21:22:14 +0000
committerdmaclach@chromium.org <dmaclach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-26 21:22:14 +0000
commitae5d37fe2c81312675fc1386bef3fc650b723f0c (patch)
treea67455465dbf208fc9249be7748046169c5d0ac8 /chrome
parent9c3cf2442bdb9c0391077190d16b8c1472f93204 (diff)
downloadchromium_src-ae5d37fe2c81312675fc1386bef3fc650b723f0c.zip
chromium_src-ae5d37fe2c81312675fc1386bef3fc650b723f0c.tar.gz
chromium_src-ae5d37fe2c81312675fc1386bef3fc650b723f0c.tar.bz2
Fixes up bookmark bubbles and the browser window so that they shut down correctly.
BookmarkBubbleController has been made an NSWindowController instead of the view controller that it used to be, and now loads its window from the nib instead of creating it on the fly. Also cleans up fullscreen mode so that the window referenced from browser_window_controller stays constant instead of having [self window] and window_ potentially pointing at two different windows. BookmarkBubble.xib has been modified so that it instantiates a window containing a bubble view instead of just instantiating a view. BUG=25054 TEST=Try going in and out of full screen mode. Try bringing up a bookmark bubble by clicking on the star. Try creating a pile of windows and then quitting, Review URL: http://codereview.chromium.org/333017 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@30095 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/app/nibs/BookmarkBubble.xib900
-rw-r--r--chrome/browser/cocoa/bookmark_bubble_controller.h40
-rw-r--r--chrome/browser/cocoa/bookmark_bubble_controller.mm107
-rw-r--r--chrome/browser/cocoa/bookmark_bubble_controller_unittest.mm112
-rw-r--r--chrome/browser/cocoa/bookmark_bubble_view_unittest.mm24
-rw-r--r--chrome/browser/cocoa/bookmark_bubble_window.h2
-rw-r--r--chrome/browser/cocoa/bookmark_bubble_window.mm10
-rw-r--r--chrome/browser/cocoa/bookmark_bubble_window_unittest.mm23
-rw-r--r--chrome/browser/cocoa/browser_window_controller.h22
-rw-r--r--chrome/browser/cocoa/browser_window_controller.mm222
-rw-r--r--chrome/browser/cocoa/browser_window_controller_unittest.mm189
-rw-r--r--chrome/browser/cocoa/bubble_view_unittest.mm36
-rw-r--r--chrome/browser/cocoa/cocoa_test_helper.h12
-rw-r--r--chrome/browser/cocoa/sad_tab_view_unittest.mm2
14 files changed, 858 insertions, 843 deletions
diff --git a/chrome/app/nibs/BookmarkBubble.xib b/chrome/app/nibs/BookmarkBubble.xib
index 7d144df..4188850 100644
--- a/chrome/app/nibs/BookmarkBubble.xib
+++ b/chrome/app/nibs/BookmarkBubble.xib
@@ -2,13 +2,13 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
<data>
<int key="IBDocument.SystemTarget">1050</int>
- <string key="IBDocument.SystemVersion">9L30</string>
+ <string key="IBDocument.SystemVersion">9L31a</string>
<string key="IBDocument.InterfaceBuilderVersion">677</string>
<string key="IBDocument.AppKitVersion">949.54</string>
<string key="IBDocument.HIToolboxVersion">353.00</string>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="39"/>
+ <integer value="34"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -34,344 +34,365 @@
<object class="NSCustomObject" id="1004">
<string key="NSClassName">NSApplication</string>
</object>
- <object class="NSCustomView" id="1005">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">268</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSTextField" id="559397096">
- <reference key="NSNextResponder" ref="1005"/>
- <int key="NSvFlags">268</int>
- <string key="NSFrame">{{17, 106}, {340, 19}}</string>
- <reference key="NSSuperview" ref="1005"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="368795405">
- <int key="NSCellFlags">68288064</int>
- <int key="NSCellFlags2">272630784</int>
- <string key="NSContents">^IDS_BOOMARK_BUBBLE_PAGE_BOOKMARK</string>
- <object class="NSFont" key="NSSupport">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">1.300000e+01</double>
- <int key="NSfFlags">1044</int>
- </object>
- <reference key="NSControlView" ref="559397096"/>
- <object class="NSColor" key="NSBackgroundColor" id="152587692">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">controlColor</string>
- <object class="NSColor" key="NSColor" id="748407352">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
- </object>
- </object>
- <object class="NSColor" key="NSTextColor" id="1000275559">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">controlTextColor</string>
- <object class="NSColor" key="NSColor" id="947148753">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MAA</bytes>
- </object>
- </object>
- </object>
- </object>
- <object class="NSCustomView" id="46287572">
- <reference key="NSNextResponder" ref="1005"/>
- <int key="NSvFlags">289</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSButton" id="82356437">
- <reference key="NSNextResponder" ref="46287572"/>
- <int key="NSvFlags">289</int>
- <string key="NSFrame">{{111, 13}, {96, 28}}</string>
- <reference key="NSSuperview" ref="46287572"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="307931553">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">134348800</int>
- <string key="NSContents">^IDS_CLOSE</string>
- <object class="NSFont" key="NSSupport" id="26">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">1.100000e+01</double>
- <int key="NSfFlags">3100</int>
+ <object class="NSCustomObject" id="704223344">
+ <string key="NSClassName">ChromeUILocalizer</string>
+ </object>
+ <object class="NSCustomObject" id="279326944">
+ <string key="NSClassName">GTMUILocalizerAndLayoutTweaker</string>
+ </object>
+ <object class="NSWindowTemplate" id="588083889">
+ <int key="NSWindowStyleMask">15</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{196, 365}, {374, 145}}</string>
+ <int key="NSWTFlags">603979776</int>
+ <string key="NSWindowTitle">Window</string>
+ <string key="NSWindowClass">BookmarkBubbleWindow</string>
+ <nil key="NSViewClass"/>
+ <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ <object class="NSView" key="NSWindowView" id="45997296">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomView" id="1005">
+ <reference key="NSNextResponder" ref="45997296"/>
+ <int key="NSvFlags">268</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="559397096">
+ <reference key="NSNextResponder" ref="1005"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 106}, {340, 19}}</string>
+ <reference key="NSSuperview" ref="1005"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="368795405">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">^IDS_BOOMARK_BUBBLE_PAGE_BOOKMARK</string>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.300000e+01</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="559397096"/>
+ <object class="NSColor" key="NSBackgroundColor" id="152587692">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor" id="748407352">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="1000275559">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <object class="NSColor" key="NSColor" id="947148753">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
</object>
- <reference key="NSControlView" ref="82356437"/>
- <int key="NSButtonFlags">-2038284033</int>
- <int key="NSButtonFlags2">129</int>
- <string key="NSAlternateContents"/>
- <string type="base64-UTF8" key="NSKeyEquivalent">DQ</string>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
</object>
- </object>
- <object class="NSButton" id="430629007">
- <reference key="NSNextResponder" ref="46287572"/>
- <int key="NSvFlags">289</int>
- <string key="NSFrame">{{15, 13}, {96, 28}}</string>
- <reference key="NSSuperview" ref="46287572"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="562929863">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">134348800</int>
- <string key="NSContents">^IDS_BOOMARK_BUBBLE_OPTIONS</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="430629007"/>
- <int key="NSButtonFlags">-2038284033</int>
- <int key="NSButtonFlags2">129</int>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">200</int>
- <int key="NSPeriodicInterval">25</int>
- </object>
- </object>
- </object>
- <string key="NSFrame">{{152, 0}, {222, 42}}</string>
- <reference key="NSSuperview" ref="1005"/>
- <string key="NSClassName">GTMWidthBasedTweaker</string>
- </object>
- <object class="NSCustomView" id="209382123">
- <reference key="NSNextResponder" ref="1005"/>
- <int key="NSvFlags">292</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSButton" id="177936093">
- <reference key="NSNextResponder" ref="209382123"/>
- <int key="NSvFlags">292</int>
- <string key="NSFrame">{{15, 13}, {96, 28}}</string>
- <reference key="NSSuperview" ref="209382123"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSButtonCell" key="NSCell" id="1066753170">
- <int key="NSCellFlags">-2080244224</int>
- <int key="NSCellFlags2">134348800</int>
- <string key="NSContents">^IDS_BOOMARK_BUBBLE_REMOVE_BOOKMARK</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="177936093"/>
- <int key="NSButtonFlags">-2038021889</int>
- <int key="NSButtonFlags2">129</int>
- <object class="NSFont" key="NSAlternateImage">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">1.100000e+01</double>
- <int key="NSfFlags">16</int>
+ <object class="NSCustomView" id="46287572">
+ <reference key="NSNextResponder" ref="1005"/>
+ <int key="NSvFlags">289</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSButton" id="82356437">
+ <reference key="NSNextResponder" ref="46287572"/>
+ <int key="NSvFlags">289</int>
+ <string key="NSFrame">{{111, 13}, {96, 28}}</string>
+ <reference key="NSSuperview" ref="46287572"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="307931553">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134348800</int>
+ <string key="NSContents">^IDS_CLOSE</string>
+ <object class="NSFont" key="NSSupport" id="26">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.100000e+01</double>
+ <int key="NSfFlags">3100</int>
+ </object>
+ <reference key="NSControlView" ref="82356437"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string type="base64-UTF8" key="NSKeyEquivalent">DQ</string>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="430629007">
+ <reference key="NSNextResponder" ref="46287572"/>
+ <int key="NSvFlags">289</int>
+ <string key="NSFrame">{{15, 13}, {96, 28}}</string>
+ <reference key="NSSuperview" ref="46287572"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="562929863">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134348800</int>
+ <string key="NSContents">^IDS_BOOMARK_BUBBLE_OPTIONS</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="430629007"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
</object>
- <string key="NSAlternateContents"/>
- <string key="NSKeyEquivalent"/>
- <int key="NSPeriodicDelay">400</int>
- <int key="NSPeriodicInterval">75</int>
- </object>
- </object>
- </object>
- <string key="NSFrameSize">{126, 42}</string>
- <reference key="NSSuperview" ref="1005"/>
- <string key="NSClassName">GTMWidthBasedTweaker</string>
- </object>
- <object class="NSCustomView" id="900754038">
- <reference key="NSNextResponder" ref="1005"/>
- <int key="NSvFlags">268</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSTextField" id="303910295">
- <reference key="NSNextResponder" ref="900754038"/>
- <int key="NSvFlags">265</int>
- <string key="NSFrame">{{17, 31}, {65, 14}}</string>
- <reference key="NSSuperview" ref="900754038"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="628112279">
- <int key="NSCellFlags">68288064</int>
- <int key="NSCellFlags2">272761856</int>
- <string key="NSContents">^IDS_BOOMARK_BUBBLE_TITLE_TEXT</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="303910295"/>
- <reference key="NSBackgroundColor" ref="152587692"/>
- <reference key="NSTextColor" ref="1000275559"/>
- </object>
- </object>
- <object class="NSTextField" id="228609717">
- <reference key="NSNextResponder" ref="900754038"/>
- <int key="NSvFlags">265</int>
- <string key="NSFrame">{{17, 6}, {65, 14}}</string>
- <reference key="NSSuperview" ref="900754038"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="295393049">
- <int key="NSCellFlags">68288064</int>
- <int key="NSCellFlags2">272761856</int>
- <string key="NSContents">^IDS_BOOMARK_BUBBLE_FOLDER_TEXT</string>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="228609717"/>
- <reference key="NSBackgroundColor" ref="152587692"/>
- <reference key="NSTextColor" ref="1000275559"/>
+ <string key="NSFrame">{{152, 0}, {222, 42}}</string>
+ <reference key="NSSuperview" ref="1005"/>
+ <string key="NSClassName">GTMWidthBasedTweaker</string>
</object>
- </object>
- </object>
- <string key="NSFrame">{{0, 50}, {84, 53}}</string>
- <reference key="NSSuperview" ref="1005"/>
- <string key="NSClassName">GTMWidthBasedTweaker</string>
- </object>
- <object class="NSBox" id="899552678">
- <reference key="NSNextResponder" ref="1005"/>
- <int key="NSvFlags">10</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSView" id="583964310">
- <reference key="NSNextResponder" ref="899552678"/>
- <int key="NSvFlags">256</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSTextField" id="39428350">
- <reference key="NSNextResponder" ref="583964310"/>
- <int key="NSvFlags">266</int>
- <string key="NSFrame">{{8, 33}, {267, 19}}</string>
- <reference key="NSSuperview" ref="583964310"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSTextFieldCell" key="NSCell" id="905670292">
- <int key="NSCellFlags">-1804468671</int>
- <int key="NSCellFlags2">272761856</int>
- <string key="NSContents"/>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="39428350"/>
- <bool key="NSDrawsBackground">YES</bool>
- <object class="NSColor" key="NSBackgroundColor" id="1033293763">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">textBackgroundColor</string>
- <object class="NSColor" key="NSColor" id="660986653">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
+ <object class="NSCustomView" id="209382123">
+ <reference key="NSNextResponder" ref="1005"/>
+ <int key="NSvFlags">292</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSButton" id="177936093">
+ <reference key="NSNextResponder" ref="209382123"/>
+ <int key="NSvFlags">292</int>
+ <string key="NSFrame">{{15, 13}, {96, 28}}</string>
+ <reference key="NSSuperview" ref="209382123"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="1066753170">
+ <int key="NSCellFlags">-2080244224</int>
+ <int key="NSCellFlags2">134348800</int>
+ <string key="NSContents">^IDS_BOOMARK_BUBBLE_REMOVE_BOOKMARK</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="177936093"/>
+ <int key="NSButtonFlags">-2038021889</int>
+ <int key="NSButtonFlags2">129</int>
+ <object class="NSFont" key="NSAlternateImage">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.100000e+01</double>
+ <int key="NSfFlags">16</int>
</object>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
</object>
- <object class="NSColor" key="NSTextColor">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">textColor</string>
- <reference key="NSColor" ref="947148753"/>
+ </object>
+ </object>
+ <string key="NSFrameSize">{126, 42}</string>
+ <reference key="NSSuperview" ref="1005"/>
+ <string key="NSClassName">GTMWidthBasedTweaker</string>
+ </object>
+ <object class="NSCustomView" id="900754038">
+ <reference key="NSNextResponder" ref="1005"/>
+ <int key="NSvFlags">268</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="303910295">
+ <reference key="NSNextResponder" ref="900754038"/>
+ <int key="NSvFlags">265</int>
+ <string key="NSFrame">{{17, 31}, {65, 14}}</string>
+ <reference key="NSSuperview" ref="900754038"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="628112279">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272761856</int>
+ <string key="NSContents">^IDS_BOOMARK_BUBBLE_TITLE_TEXT</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="303910295"/>
+ <reference key="NSBackgroundColor" ref="152587692"/>
+ <reference key="NSTextColor" ref="1000275559"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="228609717">
+ <reference key="NSNextResponder" ref="900754038"/>
+ <int key="NSvFlags">265</int>
+ <string key="NSFrame">{{17, 6}, {65, 14}}</string>
+ <reference key="NSSuperview" ref="900754038"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="295393049">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272761856</int>
+ <string key="NSContents">^IDS_BOOMARK_BUBBLE_FOLDER_TEXT</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="228609717"/>
+ <reference key="NSBackgroundColor" ref="152587692"/>
+ <reference key="NSTextColor" ref="1000275559"/>
</object>
</object>
</object>
- <object class="NSComboBox" id="977232728">
- <reference key="NSNextResponder" ref="583964310"/>
- <int key="NSvFlags">266</int>
- <string key="NSFrame">{{8, 5}, {270, 22}}</string>
- <reference key="NSSuperview" ref="583964310"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSComboBoxCell" key="NSCell" id="1003570867">
- <int key="NSCellFlags">74579521</int>
- <int key="NSCellFlags2">272761856</int>
- <string key="NSContents"/>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="977232728"/>
- <bool key="NSDrawsBackground">YES</bool>
- <reference key="NSBackgroundColor" ref="1033293763"/>
- <reference key="NSTextColor" ref="1000275559"/>
- <int key="NSVisibleItemCount">5</int>
- <bool key="NSHasVerticalScroller">YES</bool>
- <reference key="NSDelegate" ref="977232728"/>
- <object class="NSComboTableView" key="NSTableView" id="1071628594">
- <reference key="NSNextResponder"/>
- <int key="NSvFlags">274</int>
- <string key="NSFrameSize">{15, 0}</string>
- <reference key="NSSuperview"/>
- <reference key="NSWindow"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSMutableArray" key="NSTableColumns">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSTableColumn">
- <integer value="0" key="NSIdentifier"/>
- <double key="NSWidth">1.200000e+01</double>
- <double key="NSMinWidth">1.000000e+01</double>
- <double key="NSMaxWidth">1.000000e+03</double>
- <object class="NSTableHeaderCell" key="NSHeaderCell">
- <int key="NSCellFlags">75628032</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents"/>
- <object class="NSFont" key="NSSupport">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">1.200000e+01</double>
- <int key="NSfFlags">16</int>
- </object>
- <object class="NSColor" key="NSBackgroundColor">
+ <string key="NSFrame">{{0, 50}, {84, 53}}</string>
+ <reference key="NSSuperview" ref="1005"/>
+ <string key="NSClassName">GTMWidthBasedTweaker</string>
+ </object>
+ <object class="NSBox" id="899552678">
+ <reference key="NSNextResponder" ref="1005"/>
+ <int key="NSvFlags">10</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSView" id="583964310">
+ <reference key="NSNextResponder" ref="899552678"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="39428350">
+ <reference key="NSNextResponder" ref="583964310"/>
+ <int key="NSvFlags">266</int>
+ <string key="NSFrame">{{8, 33}, {267, 19}}</string>
+ <reference key="NSSuperview" ref="583964310"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="905670292">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">272761856</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="39428350"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <object class="NSColor" key="NSBackgroundColor" id="1033293763">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textBackgroundColor</string>
+ <object class="NSColor" key="NSColor" id="660986653">
<int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+ <bytes key="NSWhite">MQA</bytes>
</object>
- <reference key="NSTextColor" ref="660986653"/>
</object>
- <object class="NSTextFieldCell" key="NSDataCell">
- <int key="NSCellFlags">338820672</int>
- <int key="NSCellFlags2">1024</int>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSControlView" ref="1071628594"/>
- <bool key="NSDrawsBackground">YES</bool>
- <object class="NSColor" key="NSBackgroundColor" id="744868739">
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textColor</string>
+ <reference key="NSColor" ref="947148753"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSComboBox" id="977232728">
+ <reference key="NSNextResponder" ref="583964310"/>
+ <int key="NSvFlags">266</int>
+ <string key="NSFrame">{{8, 5}, {270, 22}}</string>
+ <reference key="NSSuperview" ref="583964310"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSComboBoxCell" key="NSCell" id="1003570867">
+ <int key="NSCellFlags">74579521</int>
+ <int key="NSCellFlags2">272761856</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="977232728"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="1033293763"/>
+ <reference key="NSTextColor" ref="1000275559"/>
+ <int key="NSVisibleItemCount">5</int>
+ <bool key="NSHasVerticalScroller">YES</bool>
+ <reference key="NSDelegate" ref="977232728"/>
+ <object class="NSComboTableView" key="NSTableView" id="1071628594">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <string key="NSFrameSize">{15, 0}</string>
+ <reference key="NSSuperview"/>
+ <reference key="NSWindow"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSMutableArray" key="NSTableColumns">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTableColumn">
+ <integer value="0" key="NSIdentifier"/>
+ <double key="NSWidth">1.200000e+01</double>
+ <double key="NSMinWidth">1.000000e+01</double>
+ <double key="NSMaxWidth">1.000000e+03</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628032</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents"/>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.200000e+01</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+ </object>
+ <reference key="NSTextColor" ref="660986653"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="1071628594"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <object class="NSColor" key="NSBackgroundColor" id="744868739">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlBackgroundColor</string>
+ <reference key="NSColor" ref="748407352"/>
+ </object>
+ <reference key="NSTextColor" ref="1000275559"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <reference key="NSTableView" ref="1071628594"/>
+ </object>
+ </object>
+ <double key="NSIntercellSpacingWidth">3.000000e+00</double>
+ <double key="NSIntercellSpacingHeight">2.000000e+00</double>
+ <reference key="NSBackgroundColor" ref="744868739"/>
+ <object class="NSColor" key="NSGridColor">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
- <string key="NSColorName">controlBackgroundColor</string>
- <reference key="NSColor" ref="748407352"/>
+ <string key="NSColorName">gridColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC41AA</bytes>
+ </object>
</object>
- <reference key="NSTextColor" ref="1000275559"/>
+ <double key="NSRowHeight">1.600000e+01</double>
+ <string key="NSAction">tableViewAction:</string>
+ <int key="NSTvFlags">-767524864</int>
+ <reference key="NSDelegate" ref="1003570867"/>
+ <reference key="NSDataSource" ref="1003570867"/>
+ <reference key="NSTarget" ref="1003570867"/>
+ <int key="NSColumnAutoresizingStyle">1</int>
+ <int key="NSDraggingSourceMaskForLocal">15</int>
+ <int key="NSDraggingSourceMaskForNonLocal">0</int>
+ <bool key="NSAllowsTypeSelect">YES</bool>
</object>
- <int key="NSResizingMask">3</int>
- <bool key="NSIsResizeable">YES</bool>
- <reference key="NSTableView" ref="1071628594"/>
</object>
</object>
- <double key="NSIntercellSpacingWidth">3.000000e+00</double>
- <double key="NSIntercellSpacingHeight">2.000000e+00</double>
- <reference key="NSBackgroundColor" ref="744868739"/>
- <object class="NSColor" key="NSGridColor">
- <int key="NSColorSpace">6</int>
- <string key="NSCatalogName">System</string>
- <string key="NSColorName">gridColor</string>
- <object class="NSColor" key="NSColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC41AA</bytes>
- </object>
- </object>
- <double key="NSRowHeight">1.600000e+01</double>
- <string key="NSAction">tableViewAction:</string>
- <int key="NSTvFlags">-767524864</int>
- <reference key="NSDelegate" ref="1003570867"/>
- <reference key="NSDataSource" ref="1003570867"/>
- <reference key="NSTarget" ref="1003570867"/>
- <int key="NSColumnAutoresizingStyle">1</int>
- <int key="NSDraggingSourceMaskForLocal">15</int>
- <int key="NSDraggingSourceMaskForNonLocal">0</int>
- <bool key="NSAllowsTypeSelect">YES</bool>
</object>
+ <string key="NSFrameSize">{294, 59}</string>
+ <reference key="NSSuperview" ref="899552678"/>
</object>
</object>
+ <string key="NSFrame">{{79, 46}, {294, 59}}</string>
+ <reference key="NSSuperview" ref="1005"/>
+ <string key="NSOffsets">{0, 0}</string>
+ <object class="NSTextFieldCell" key="NSTitleCell">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSBackgroundColor" ref="1033293763"/>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
+ </object>
+ </object>
+ <reference key="NSContentView" ref="583964310"/>
+ <int key="NSBorderType">0</int>
+ <int key="NSBoxType">0</int>
+ <int key="NSTitlePosition">0</int>
+ <bool key="NSTransparent">NO</bool>
</object>
- <string key="NSFrameSize">{294, 59}</string>
- <reference key="NSSuperview" ref="899552678"/>
</object>
+ <string key="NSFrameSize">{374, 145}</string>
+ <reference key="NSSuperview" ref="45997296"/>
+ <string key="NSClassName">BookmarkBubbleView</string>
</object>
- <string key="NSFrame">{{79, 46}, {294, 59}}</string>
- <reference key="NSSuperview" ref="1005"/>
- <string key="NSOffsets">{0, 0}</string>
- <object class="NSTextFieldCell" key="NSTitleCell">
- <int key="NSCellFlags">67239424</int>
- <int key="NSCellFlags2">0</int>
- <string key="NSContents"/>
- <reference key="NSSupport" ref="26"/>
- <reference key="NSBackgroundColor" ref="1033293763"/>
- <object class="NSColor" key="NSTextColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
- </object>
- </object>
- <reference key="NSContentView" ref="583964310"/>
- <int key="NSBorderType">0</int>
- <int key="NSBoxType">0</int>
- <int key="NSTitlePosition">0</int>
- <bool key="NSTransparent">NO</bool>
</object>
+ <string key="NSFrameSize">{374, 145}</string>
+ <reference key="NSSuperview"/>
</object>
- <string key="NSFrameSize">{374, 145}</string>
- <reference key="NSSuperview"/>
- <string key="NSClassName">BookmarkBubbleView</string>
- </object>
- <object class="NSCustomObject" id="704223344">
- <string key="NSClassName">ChromeUILocalizer</string>
- </object>
- <object class="NSCustomObject" id="279326944">
- <string key="NSClassName">GTMUILocalizerAndLayoutTweaker</string>
+ <string key="NSScreenRect">{{0, 0}, {2560, 1578}}</string>
+ <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
</object>
</object>
<object class="IBObjectContainer" key="IBDocument.Objects">
@@ -402,14 +423,6 @@
<int key="connectionID">25</int>
</object>
<object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">close:</string>
- <reference key="source" ref="1001"/>
- <reference key="destination" ref="82356437"/>
- </object>
- <int key="connectionID">26</int>
- </object>
- <object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">bigTitle_</string>
<reference key="source" ref="1001"/>
@@ -427,14 +440,6 @@
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
- <string key="label">view</string>
- <reference key="source" ref="1001"/>
- <reference key="destination" ref="1005"/>
- </object>
- <int key="connectionID">30</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
<string key="label">folderComboBox_</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="977232728"/>
@@ -473,6 +478,38 @@
</object>
<int key="connectionID">44</int>
</object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="588083889"/>
+ </object>
+ <int key="connectionID">52</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="588083889"/>
+ <reference key="destination" ref="1001"/>
+ </object>
+ <int key="connectionID">53</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">initialFirstResponder</string>
+ <reference key="source" ref="588083889"/>
+ <reference key="destination" ref="39428350"/>
+ </object>
+ <int key="connectionID">54</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">ok:</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="82356437"/>
+ </object>
+ <int key="connectionID">56</int>
+ </object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -504,6 +541,34 @@
<string key="objectName">Application</string>
</object>
<object class="IBObjectRecord">
+ <int key="objectID">31</int>
+ <reference key="object" ref="704223344"/>
+ <reference key="parent" ref="376579351"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">42</int>
+ <reference key="object" ref="279326944"/>
+ <reference key="parent" ref="376579351"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">50</int>
+ <reference key="object" ref="588083889"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="45997296"/>
+ </object>
+ <reference key="parent" ref="376579351"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">51</int>
+ <reference key="object" ref="45997296"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1005"/>
+ </object>
+ <reference key="parent" ref="588083889"/>
+ </object>
+ <object class="IBObjectRecord">
<int key="objectID">1</int>
<reference key="object" ref="1005"/>
<object class="NSMutableArray" key="children">
@@ -514,7 +579,7 @@
<reference ref="900754038"/>
<reference ref="899552678"/>
</object>
- <reference key="parent" ref="376579351"/>
+ <reference key="parent" ref="45997296"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2</int>
@@ -526,16 +591,6 @@
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">3</int>
- <reference key="object" ref="368795405"/>
- <reference key="parent" ref="559397096"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">31</int>
- <reference key="object" ref="704223344"/>
- <reference key="parent" ref="376579351"/>
- </object>
- <object class="IBObjectRecord">
<int key="objectID">34</int>
<reference key="object" ref="46287572"/>
<object class="NSMutableArray" key="children">
@@ -546,65 +601,61 @@
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">18</int>
- <reference key="object" ref="82356437"/>
+ <int key="objectID">35</int>
+ <reference key="object" ref="209382123"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="307931553"/>
+ <reference ref="177936093"/>
</object>
- <reference key="parent" ref="46287572"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">19</int>
- <reference key="object" ref="307931553"/>
- <reference key="parent" ref="82356437"/>
+ <reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">16</int>
- <reference key="object" ref="430629007"/>
+ <int key="objectID">36</int>
+ <reference key="object" ref="900754038"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="562929863"/>
+ <reference ref="303910295"/>
+ <reference ref="228609717"/>
</object>
- <reference key="parent" ref="46287572"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">17</int>
- <reference key="object" ref="562929863"/>
- <reference key="parent" ref="430629007"/>
+ <reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">35</int>
- <reference key="object" ref="209382123"/>
+ <int key="objectID">39</int>
+ <reference key="object" ref="899552678"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="177936093"/>
+ <reference ref="39428350"/>
+ <reference ref="977232728"/>
</object>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">20</int>
- <reference key="object" ref="177936093"/>
+ <int key="objectID">12</int>
+ <reference key="object" ref="39428350"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="1066753170"/>
+ <reference ref="905670292"/>
</object>
- <reference key="parent" ref="209382123"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">21</int>
- <reference key="object" ref="1066753170"/>
- <reference key="parent" ref="177936093"/>
+ <reference key="parent" ref="899552678"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">36</int>
- <reference key="object" ref="900754038"/>
+ <int key="objectID">14</int>
+ <reference key="object" ref="977232728"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="303910295"/>
- <reference ref="228609717"/>
+ <reference ref="1003570867"/>
</object>
- <reference key="parent" ref="1005"/>
+ <reference key="parent" ref="899552678"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">15</int>
+ <reference key="object" ref="1003570867"/>
+ <reference key="parent" ref="977232728"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">13</int>
+ <reference key="object" ref="905670292"/>
+ <reference key="parent" ref="39428350"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">8</int>
@@ -616,11 +667,6 @@
<reference key="parent" ref="900754038"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">9</int>
- <reference key="object" ref="628112279"/>
- <reference key="parent" ref="303910295"/>
- </object>
- <object class="IBObjectRecord">
<int key="objectID">10</int>
<reference key="object" ref="228609717"/>
<object class="NSMutableArray" key="children">
@@ -635,47 +681,56 @@
<reference key="parent" ref="228609717"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">39</int>
- <reference key="object" ref="899552678"/>
+ <int key="objectID">9</int>
+ <reference key="object" ref="628112279"/>
+ <reference key="parent" ref="303910295"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">20</int>
+ <reference key="object" ref="177936093"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="39428350"/>
- <reference ref="977232728"/>
+ <reference ref="1066753170"/>
</object>
- <reference key="parent" ref="1005"/>
+ <reference key="parent" ref="209382123"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">12</int>
- <reference key="object" ref="39428350"/>
+ <int key="objectID">21</int>
+ <reference key="object" ref="1066753170"/>
+ <reference key="parent" ref="177936093"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">18</int>
+ <reference key="object" ref="82356437"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="905670292"/>
+ <reference ref="307931553"/>
</object>
- <reference key="parent" ref="899552678"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">13</int>
- <reference key="object" ref="905670292"/>
- <reference key="parent" ref="39428350"/>
+ <reference key="parent" ref="46287572"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">14</int>
- <reference key="object" ref="977232728"/>
+ <int key="objectID">16</int>
+ <reference key="object" ref="430629007"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="1003570867"/>
+ <reference ref="562929863"/>
</object>
- <reference key="parent" ref="899552678"/>
+ <reference key="parent" ref="46287572"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">15</int>
- <reference key="object" ref="1003570867"/>
- <reference key="parent" ref="977232728"/>
+ <int key="objectID">17</int>
+ <reference key="object" ref="562929863"/>
+ <reference key="parent" ref="430629007"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">42</int>
- <reference key="object" ref="279326944"/>
- <reference key="parent" ref="376579351"/>
+ <int key="objectID">19</int>
+ <reference key="object" ref="307931553"/>
+ <reference key="parent" ref="82356437"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">3</int>
+ <reference key="object" ref="368795405"/>
+ <reference key="parent" ref="559397096"/>
</object>
</object>
</object>
@@ -707,6 +762,11 @@
<string>3.IBPluginDependency</string>
<string>31.IBPluginDependency</string>
<string>42.IBPluginDependency</string>
+ <string>50.IBEditorWindowLastContentRect</string>
+ <string>50.IBPluginDependency</string>
+ <string>50.IBWindowTemplateEditedContentRect</string>
+ <string>50.NSWindowTemplate.visibleAtLaunch</string>
+ <string>51.IBPluginDependency</string>
<string>8.IBPluginDependency</string>
<string>9.IBPluginDependency</string>
</object>
@@ -715,7 +775,7 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>{{407, 412}, {374, 145}}</string>
+ <string>{{126, 412}, {374, 145}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<object class="NSMutableArray">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -743,6 +803,11 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{241, 633}, {374, 145}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{241, 633}, {374, 145}}</string>
+ <boolean value="YES"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
</object>
@@ -767,20 +832,21 @@
</object>
</object>
<nil key="sourceID"/>
- <int key="maxID">44</int>
+ <int key="maxID">56</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBPartialClassDescription">
<string key="className">BookmarkBubbleController</string>
- <string key="superclassName">NSViewController</string>
+ <string key="superclassName">NSWindowController</string>
<object class="NSMutableDictionary" key="actions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSMutableArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
- <string>close:</string>
+ <string>cancel:</string>
<string>edit:</string>
+ <string>ok:</string>
<string>remove:</string>
</object>
<object class="NSMutableArray" key="dict.values">
@@ -788,6 +854,7 @@
<string>id</string>
<string>id</string>
<string>id</string>
+ <string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
@@ -821,6 +888,14 @@
</object>
</object>
<object class="IBPartialClassDescription">
+ <string key="className">BookmarkBubbleWindow</string>
+ <string key="superclassName">NSWindow</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">browser/cocoa/bookmark_bubble_window.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
<string key="className">ChromeUILocalizer</string>
<string key="superclassName">GTMUILocalizer</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
@@ -908,6 +983,13 @@
<string key="minorKey">browser/cocoa/tab_strip_model_observer_bridge.h</string>
</object>
</object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSWindow</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">browser/cocoa/nswindow_local_state.h</string>
+ </object>
+ </object>
</object>
</object>
<int key="IBDocument.localizationMode">0</int>
diff --git a/chrome/browser/cocoa/bookmark_bubble_controller.h b/chrome/browser/cocoa/bookmark_bubble_controller.h
index df387a9..0ad77c1 100644
--- a/chrome/browser/cocoa/bookmark_bubble_controller.h
+++ b/chrome/browser/cocoa/bookmark_bubble_controller.h
@@ -16,36 +16,21 @@ class BookmarkNode;
// The bubble asks the delegate to perform an edit when needed.
- (void)editBookmarkNode:(const BookmarkNode*)node;
-// The bubble tells its delegate when it's done and can be deallocated.
-- (void)doneWithBubbleController:(BookmarkBubbleController*)controller;
-
@end
// Controller for the bookmark bubble. The bookmark bubble is a
// bubble that pops up when clicking on the STAR next to the URL to
// add or remove it as a bookmark. This bubble allows for editing of
// the bookmark in various ways (name, folder, etc.)
-//
-// The bubble is stored in a nib as a view, not as a window, so we can
-// make it an actual bubble. There is no nib-rific way to encode a
-// NSBorderlessWindowMask NSWindow, and the style of an NSWindow can't
-// be set other than init time. To deal, we create the NSWindow
-// programatically, but encode the view in a nib. Thus,
-// BookmarkBubbleController is an NSViewController, not an
-// NSWindowController.
-@interface BookmarkBubbleController : NSViewController<NSWindowDelegate> {
+@interface BookmarkBubbleController : NSWindowController<NSWindowDelegate> {
@private
- // Unexpected for this controller, perhaps, but our window does NOT
- // come from a nib.
- scoped_nsobject<NSWindow> window_;
-
id<BookmarkBubbleControllerDelegate> delegate_; // weak like other delegates
NSWindow* parentWindow_; // weak
NSPoint topLeftForBubble_;
// Both weak; owned by the current browser's profile
- BookmarkModel* model_;
- const BookmarkNode* node_;
+ BookmarkModel* model_; // weak
+ const BookmarkNode* node_; // weak
// A mapping from titles to nodes so we only have to walk this once.
scoped_nsobject<NSMutableArray> titleMapping_;
@@ -71,29 +56,26 @@ class BookmarkNode;
node:(const BookmarkNode*)node
alreadyBookmarked:(BOOL)alreadyBookmarked;
-- (void)showWindow;
-
// Actions for buttons in the dialog.
- (IBAction)edit:(id)sender;
-- (IBAction)close:(id)sender;
+- (IBAction)ok:(id)sender;
- (IBAction)remove:(id)sender;
+- (IBAction)cancel:(id)sender;
@end
// Exposed only for unit testing.
@interface BookmarkBubbleController(ExposedForUnitTesting)
-- (NSWindow*)createBubbleWindow;
- (void)fillInFolderList;
-- (BOOL)windowHasBeenClosed;
- (void)addFolderNodes:(const BookmarkNode*)parent toComboBox:(NSComboBox*)box;
- (void)updateBookmarkNode;
-- (void)setTitle:(NSString *)title parentFolder:(NSString*)folder;
+- (void)setTitle:(NSString*)title parentFolder:(NSString*)folder;
- (NSString*)chooseAnotherFolderString;
+- (NSComboBox*)folderComboBox;
@end
-// Also private but I need to declare them specially for @synthesize to work.
-@interface BookmarkBubbleController ()
-@property (readonly) id delegate;
-@property (readonly) NSComboBox* folderComboBox;
-@end
+
+
+
+
diff --git a/chrome/browser/cocoa/bookmark_bubble_controller.mm b/chrome/browser/cocoa/bookmark_bubble_controller.mm
index 9e44741..cb88fd5 100644
--- a/chrome/browser/cocoa/bookmark_bubble_controller.mm
+++ b/chrome/browser/cocoa/bookmark_bubble_controller.mm
@@ -11,25 +11,18 @@
#include "chrome/browser/metrics/user_metrics.h"
#include "grit/generated_resources.h"
-
-@interface BookmarkBubbleController(PrivateAPI)
-- (void)closeWindow;
-@end
-
@implementation BookmarkBubbleController
-@synthesize delegate = delegate_;
-@synthesize folderComboBox = folderComboBox_;
-
- (id)initWithDelegate:(id<BookmarkBubbleControllerDelegate>)delegate
parentWindow:(NSWindow*)parentWindow
topLeftForBubble:(NSPoint)topLeftForBubble
model:(BookmarkModel*)model
node:(const BookmarkNode*)node
alreadyBookmarked:(BOOL)alreadyBookmarked {
- if ((self = [super initWithNibName:@"BookmarkBubble"
- bundle:mac_util::MainAppBundle()])) {
- // All these are weak...
+ NSString* nibPath =
+ [mac_util::MainAppBundle() pathForResource:@"BookmarkBubble"
+ ofType:@"nib"];
+ if ((self = [super initWithWindowNibPath:nibPath owner:self])) {
delegate_ = delegate;
parentWindow_ = parentWindow;
topLeftForBubble_ = topLeftForBubble;
@@ -42,45 +35,37 @@
return self;
}
-- (void)dealloc {
- [self closeWindow];
- [super dealloc];
-}
-
-- (void)showWindow {
- [self view]; // force nib load and window_ allocation
- [window_ makeKeyAndOrderFront:self];
+- (void)windowWillClose:(NSNotification *)notification {
+ [self autorelease];
}
-// Actually close the window. Do nothing else.
-- (void)closeWindow {
- [parentWindow_ removeChildWindow:window_];
- [window_ close];
-}
-
-- (void)awakeFromNib {
- window_.reset([self createBubbleWindow]);
- [parentWindow_ addChildWindow:window_ ordered:NSWindowAbove];
-
- // Fill in inital values for text, controls, ...
-
+- (void)windowDidLoad {
+ NSWindow* window = [self window];
+ NSPoint origin = [parentWindow_ convertBaseToScreen:topLeftForBubble_];
+ origin.y -= NSHeight([window frame]);
+ [window setFrameOrigin:origin];
+ [parentWindow_ addChildWindow:window ordered:NSWindowAbove];
// Default is IDS_BOOMARK_BUBBLE_PAGE_BOOKMARK; "Bookmark".
// If adding for the 1st time the string becomes "Bookmark Added!"
if (!alreadyBookmarked_) {
NSString* title =
- l10n_util::GetNSString(IDS_BOOMARK_BUBBLE_PAGE_BOOKMARKED);
+ l10n_util::GetNSString(IDS_BOOMARK_BUBBLE_PAGE_BOOKMARKED);
[bigTitle_ setStringValue:title];
}
[self fillInFolderList];
}
+- (void)close {
+ [parentWindow_ removeChildWindow:[self window]];
+ [super close];
+}
+
// Shows the bookmark editor sheet for more advanced editing.
- (void)showEditor {
[self updateBookmarkNode];
- [self closeWindow];
[delegate_ editBookmarkNode:node_];
- [delegate_ doneWithBubbleController:self];
+ [self close];
}
- (IBAction)edit:(id)sender {
@@ -88,13 +73,9 @@
[self showEditor];
}
-- (IBAction)close:(id)sender {
- if (node_) {
- // no node_ if the bookmark was just removed
- [self updateBookmarkNode];
- }
- [self closeWindow];
- [delegate_ doneWithBubbleController:self];
+- (IBAction)ok:(id)sender {
+ [self updateBookmarkNode];
+ [self close];
}
// By implementing this, ESC causes the window to go away. If clicking the
@@ -105,7 +86,7 @@
// |-remove:| calls |-close| so we don't have to bother.
[self remove:sender];
} else {
- [self close:sender];
+ [self ok:sender];
}
}
@@ -113,7 +94,7 @@
model_->SetURLStarred(node_->GetURL(), node_->GetTitle(), false);
UserMetrics::RecordAction(L"BookmarkBubble_Unstar", model_->profile());
node_ = NULL; // no longer valid
- [self close:self];
+ [self ok:sender];
}
// We are the delegate of the combo box so we can tell when "choose
@@ -128,18 +109,14 @@
}
// We are the delegate of our own window so we know when we lose key.
-// When we lose key status we close, mirroring Windows behaivor.
+// When we lose key status we close, mirroring Windows behavior.
- (void)windowDidResignKey:(NSNotification*)notification {
+ DCHECK_EQ([notification object], [self window]);
- // If we get here, we are done with this window and controller. The
- // call of close: may destroy us which destroys the window. But the
- // window is in the middle of processing resignKeyWindow. We
- // retain/autorelease the window to insure it lasts until the end of
- // this event.
- [[window_ retain] autorelease];
-
- if ([window_ isVisible])
- [self close:self];
+ // Can't call close from within a window delegate method. We can call
+ // close after it's finished though. So this will call close for us next
+ // time through the event loop.
+ [self performSelector:@selector(ok:) withObject:self afterDelay:0];
}
@end // BookmarkBubbleController
@@ -147,20 +124,6 @@
@implementation BookmarkBubbleController(ExposedForUnitTesting)
-// Create and return a retained NSWindow for this bubble.
-- (NSWindow*)createBubbleWindow {
- NSRect contentRect = [[self view] frame];
- NSPoint origin = topLeftForBubble_;
- origin.y -= contentRect.size.height; // since it'll be our bottom-left
- contentRect.origin = origin;
- // Now convert to global coordinates since it'll be used for a window.
- contentRect.origin = [parentWindow_ convertBaseToScreen:contentRect.origin];
- NSWindow* window = [[BookmarkBubbleWindow alloc]
- initWithContentRect:contentRect];
- [window setDelegate:self];
- [window setContentView:[self view]];
- return window;
-}
// Fill in all information related to the folder combo box.
//
@@ -183,10 +146,6 @@
[folderComboBox_ selectItemWithObjectValue:parentTitle];
}
-- (BOOL)windowHasBeenClosed {
- return ![window_ isVisible];
-}
-
// For the given folder node, walk the tree and add folder names to
// the given combo box.
//
@@ -207,6 +166,8 @@
// Look at the dialog; if the user has changed anything, update the
// bookmark node to reflect this.
- (void)updateBookmarkNode {
+ if (!node_) return;
+
// First the title...
NSString* oldTitle = base::SysWideToNSString(node_->GetTitle());
NSString* newTitle = [nameTextField_ stringValue];
@@ -241,4 +202,8 @@
return chooseAnotherFolder_.get();
}
+- (NSComboBox*)folderComboBox {
+ return folderComboBox_;
+}
+
@end // implementation BookmarkBubbleController(ExposedForUnitTesting)
diff --git a/chrome/browser/cocoa/bookmark_bubble_controller_unittest.mm b/chrome/browser/cocoa/bookmark_bubble_controller_unittest.mm
index 91dfa72..b090504 100644
--- a/chrome/browser/cocoa/bookmark_bubble_controller_unittest.mm
+++ b/chrome/browser/cocoa/bookmark_bubble_controller_unittest.mm
@@ -13,20 +13,26 @@
#include "testing/platform_test.h"
@interface BBDelegate : NSObject<BookmarkBubbleControllerDelegate> {
- NSWindow* window_; // weak
+ @private
+ BOOL windowClosed_;
int edits_;
- int dones_;
}
+
@property (readonly) int edits;
-@property (readonly) int dones;
-@property (readonly) NSWindow* window;
+@property (readonly) BOOL windowClosed;
+
@end
@implementation BBDelegate
@synthesize edits = edits_;
-@synthesize window = window_;
-@synthesize dones = dones_;
+@synthesize windowClosed = windowClosed_;
+
+- (void)dealloc {
+ NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
+ [nc removeObserver:self];
+ [super dealloc];
+}
- (NSPoint)topLeftForBubble {
return NSMakePoint(10, 300);
@@ -36,42 +42,54 @@
edits_++;
}
-- (void)doneWithBubbleController:(BookmarkBubbleController*)controller {
- dones_++;
+- (void)setWindowController:(NSWindowController *)controller {
+ NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
+ [nc removeObserver:self];
+ if (controller) {
+ [nc addObserver:self
+ selector:@selector(windowWillClose:)
+ name:NSWindowWillCloseNotification
+ object:[controller window]];
+ }
+ windowClosed_ = NO;
}
-- (void)clear {
- edits_ = 0;
- dones_ = 0;
+- (void)windowWillClose:(NSNotification*)notification {
+ windowClosed_ = YES;
}
-
@end
namespace {
-class BookmarkBubbleControllerTest : public PlatformTest {
+class BookmarkBubbleControllerTest : public CocoaTest {
public:
- CocoaTestHelper cocoa_helper_; // Inits Cocoa, creates window, etc...
BrowserTestHelper helper_;
scoped_nsobject<BBDelegate> delegate_;
- scoped_nsobject<BookmarkBubbleController> controller_;
+ BookmarkBubbleController* controller_;
- BookmarkBubbleControllerTest() {
+ BookmarkBubbleControllerTest() : controller_(nil) {
delegate_.reset([[BBDelegate alloc] init]);
}
+ virtual void TearDown() {
+ [controller_ close];
+ CocoaTest::TearDown();
+ }
+
// Returns a controller but ownership not transferred.
// Only one of these will be valid at a time.
BookmarkBubbleController* ControllerForNode(const BookmarkNode* node) {
- controller_.reset([[BookmarkBubbleController alloc]
- initWithDelegate:delegate_.get()
- parentWindow:cocoa_helper_.window()
- topLeftForBubble:[delegate_ topLeftForBubble]
- model:helper_.profile()->GetBookmarkModel()
- node:node
- alreadyBookmarked:YES]);
- [controller_ view]; // force nib load
- return controller_.get();
+ DCHECK(controller_ == nil);
+ controller_ = [[BookmarkBubbleController alloc]
+ initWithDelegate:delegate_.get()
+ parentWindow:test_window()
+ topLeftForBubble:[delegate_ topLeftForBubble]
+ model:helper_.profile()->GetBookmarkModel()
+ node:node
+ alreadyBookmarked:YES];
+ EXPECT_TRUE([controller_ window]);
+ [delegate_ setWindowController:controller_];
+ return controller_;
}
BookmarkModel* GetBookmarkModel() {
@@ -89,9 +107,9 @@ TEST_F(BookmarkBubbleControllerTest, TestBubbleWindow) {
GURL("http://www.google.com"));
BookmarkBubbleController* controller = ControllerForNode(node);
EXPECT_TRUE(controller);
- NSWindow* window = [controller createBubbleWindow];
+ NSWindow* window = [controller window];
EXPECT_TRUE(window);
- EXPECT_TRUE(NSContainsRect([cocoa_helper_.window() frame],
+ EXPECT_TRUE(NSContainsRect([test_window() frame],
[window frame]));
}
@@ -124,7 +142,7 @@ TEST_F(BookmarkBubbleControllerTest, TestFillInFolder) {
}
// Click on edit; bubble gets closed.
-TEST_F(BookmarkBubbleControllerTest, TestSimpleActions) {
+TEST_F(BookmarkBubbleControllerTest, TestEdit) {
BookmarkModel* model = GetBookmarkModel();
const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(),
0,
@@ -134,24 +152,27 @@ TEST_F(BookmarkBubbleControllerTest, TestSimpleActions) {
EXPECT_TRUE(controller);
EXPECT_EQ([delegate_ edits], 0);
- EXPECT_EQ([delegate_ dones], 0);
- EXPECT_FALSE([controller windowHasBeenClosed]);
+ EXPECT_FALSE([delegate_ windowClosed]);
[controller edit:controller];
EXPECT_EQ([delegate_ edits], 1);
- EXPECT_EQ([delegate_ dones], 1);
- EXPECT_TRUE([controller windowHasBeenClosed]);
+ EXPECT_TRUE([delegate_ windowClosed]);
+}
- [delegate_ clear];
+// CallClose; bubble gets closed.
+TEST_F(BookmarkBubbleControllerTest, TestClose) {
+ BookmarkModel* model = GetBookmarkModel();
+ const BookmarkNode* node = model->AddURL(model->GetBookmarkBarNode(),
+ 0,
+ L"Bookie markie title",
+ GURL("http://www.google.com"));
EXPECT_EQ([delegate_ edits], 0);
- EXPECT_EQ([delegate_ dones], 0);
- controller = ControllerForNode(node);
+ BookmarkBubbleController* controller = ControllerForNode(node);
EXPECT_TRUE(controller);
- EXPECT_FALSE([controller windowHasBeenClosed]);
- [controller close:controller];
+ EXPECT_FALSE([delegate_ windowClosed]);
+ [controller ok:controller];
EXPECT_EQ([delegate_ edits], 0);
- EXPECT_EQ([delegate_ dones], 1);
- EXPECT_TRUE([controller windowHasBeenClosed]);
+ EXPECT_TRUE([delegate_ windowClosed]);
}
// User changes title and parent folder in the UI
@@ -189,8 +210,7 @@ TEST_F(BookmarkBubbleControllerTest, TestRemove) {
[controller remove:controller];
EXPECT_FALSE(model->IsBookmarked(gurl));
- EXPECT_TRUE([controller windowHasBeenClosed]);
- EXPECT_EQ([delegate_ dones], 1);
+ EXPECT_TRUE([delegate_ windowClosed]);
}
// Confirm picking "choose another folder" caused edit: to be called.
@@ -219,16 +239,16 @@ TEST_F(BookmarkBubbleControllerTest, EscapeRemovesNewBookmark) {
0,
L"Bookie markie title",
gurl);
- scoped_nsobject<BookmarkBubbleController> controller(
+ BookmarkBubbleController* controller =
[[BookmarkBubbleController alloc]
initWithDelegate:delegate_.get()
- parentWindow:cocoa_helper_.window()
+ parentWindow:test_window()
topLeftForBubble:[delegate_ topLeftForBubble]
model:helper_.profile()->GetBookmarkModel()
node:node
- alreadyBookmarked:NO]); // The last param is the key difference.
- EXPECT_TRUE(controller);
-
+ alreadyBookmarked:NO]; // The last param is the key difference.
+ EXPECT_TRUE([controller window]);
+ // Calls release on controller.
[controller cancel:nil];
EXPECT_FALSE(model->IsBookmarked(gurl));
}
diff --git a/chrome/browser/cocoa/bookmark_bubble_view_unittest.mm b/chrome/browser/cocoa/bookmark_bubble_view_unittest.mm
index 9744397..f9083f7 100644
--- a/chrome/browser/cocoa/bookmark_bubble_view_unittest.mm
+++ b/chrome/browser/cocoa/bookmark_bubble_view_unittest.mm
@@ -2,35 +2,25 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#import <Cocoa/Cocoa.h>
-
#include "base/scoped_nsobject.h"
#import "chrome/browser/cocoa/bookmark_bubble_view.h"
#import "chrome/browser/cocoa/cocoa_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
namespace {
-class BookmarkBubbleViewTest : public PlatformTest {
+class BookmarkBubbleViewTest : public CocoaTest {
public:
BookmarkBubbleViewTest() {
NSRect frame = NSMakeRect(0, 0, 100, 30);
- view_.reset([[BookmarkBubbleView alloc] initWithFrame:frame]);
- [cocoa_helper_.contentView() addSubview:view_.get()];
+ scoped_nsobject<BookmarkBubbleView> view(
+ [[BookmarkBubbleView alloc] initWithFrame:frame]);
+ view_ = view.get();
+ [[test_window() contentView] addSubview:view_];
}
- CocoaTestHelper cocoa_helper_; // Inits Cocoa, creates window, etc...
- scoped_nsobject<BookmarkBubbleView> view_;
+ BookmarkBubbleView* view_;
};
-// Test drawing and an add/remove from the view hierarchy to ensure
-// nothing leaks or crashes.
-TEST_F(BookmarkBubbleViewTest, AddRemoveDisplay) {
- [view_ display];
- EXPECT_EQ(cocoa_helper_.contentView(), [view_ superview]);
- [view_.get() removeFromSuperview];
- EXPECT_FALSE([view_ superview]);
-}
+TEST_VIEW(BookmarkBubbleViewTest, view_);
} // namespace
diff --git a/chrome/browser/cocoa/bookmark_bubble_window.h b/chrome/browser/cocoa/bookmark_bubble_window.h
index 45e2f3b..5e667ad 100644
--- a/chrome/browser/cocoa/bookmark_bubble_window.h
+++ b/chrome/browser/cocoa/bookmark_bubble_window.h
@@ -6,6 +6,4 @@
// Window for the bookmark bubble that comes up when you click on "STAR".
@interface BookmarkBubbleWindow : NSWindow
-- (id)initWithContentRect:(NSRect)contentRect;
@end
-
diff --git a/chrome/browser/cocoa/bookmark_bubble_window.mm b/chrome/browser/cocoa/bookmark_bubble_window.mm
index 7c93ce8..4b2e372 100644
--- a/chrome/browser/cocoa/bookmark_bubble_window.mm
+++ b/chrome/browser/cocoa/bookmark_bubble_window.mm
@@ -6,12 +6,14 @@
@implementation BookmarkBubbleWindow
-- (id)initWithContentRect:(NSRect)contentRect {
+- (id)initWithContentRect:(NSRect)contentRect
+ styleMask:(NSUInteger)aStyle
+ backing:(NSBackingStoreType)bufferingType
+ defer:(BOOL)flag {
if ((self = [super initWithContentRect:contentRect
styleMask:NSBorderlessWindowMask
- backing:NSBackingStoreBuffered
- defer:YES])) {
- [self setReleasedWhenClosed:NO];
+ backing:bufferingType
+ defer:flag])) {
[self setBackgroundColor:[NSColor clearColor]];
[self setExcludedFromWindowsMenu:YES];
[self setAlphaValue:1.0];
diff --git a/chrome/browser/cocoa/bookmark_bubble_window_unittest.mm b/chrome/browser/cocoa/bookmark_bubble_window_unittest.mm
index 9c53652..bae4697 100644
--- a/chrome/browser/cocoa/bookmark_bubble_window_unittest.mm
+++ b/chrome/browser/cocoa/bookmark_bubble_window_unittest.mm
@@ -5,24 +5,21 @@
#include "base/scoped_ptr.h"
#include "chrome/browser/cocoa/cocoa_test_helper.h"
#include "chrome/browser/cocoa/bookmark_bubble_window.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-class BookmarkBubbleWindowTest : public PlatformTest {
- public:
- CocoaTestHelper cocoa_helper_;
+class BookmarkBubbleWindowTest : public CocoaTest {
};
TEST_F(BookmarkBubbleWindowTest, Basics) {
- scoped_nsobject<BookmarkBubbleWindow> window_;
- window_.reset([[BookmarkBubbleWindow alloc]
- initWithContentRect:NSMakeRect(0,0,10,10)]);
+ BookmarkBubbleWindow* window =
+ [[BookmarkBubbleWindow alloc] initWithContentRect:NSMakeRect(0, 0, 10, 10)
+ styleMask:NSBorderlessWindowMask
+ backing:NSBackingStoreBuffered
+ defer:NO];
+ EXPECT_TRUE([window canBecomeKeyWindow]);
+ EXPECT_FALSE([window canBecomeMainWindow]);
- EXPECT_TRUE([window_ canBecomeKeyWindow]);
- EXPECT_FALSE([window_ canBecomeMainWindow]);
-
- EXPECT_TRUE([window_ isExcludedFromWindowsMenu]);
- EXPECT_FALSE([window_ isReleasedWhenClosed]);
+ EXPECT_TRUE([window isExcludedFromWindowsMenu]);
+ [window close];
}
diff --git a/chrome/browser/cocoa/browser_window_controller.h b/chrome/browser/cocoa/browser_window_controller.h
index 1be8fbc..d74e3a8 100644
--- a/chrome/browser/cocoa/browser_window_controller.h
+++ b/chrome/browser/cocoa/browser_window_controller.h
@@ -50,14 +50,9 @@ class TabStripModelObserverBridge;
// The ordering of these members is important as it determines the order in
// which they are destroyed. |browser_| needs to be destroyed last as most of
// the other objects hold weak references to it or things it owns
- // (tab/toolbar/bookmark models, profiles, etc). We hold a strong ref to the
- // window so that it will live after the NSWindowController dealloc has run
- // (which happens *before* these scoped pointers are torn down). Keeping it
- // alive ensures that weak view or window pointers remain valid through
- // their destruction sequence.
+ // (tab/toolbar/bookmark models, profiles, etc).
scoped_ptr<Browser> browser_;
- scoped_nsobject<ChromeBrowserWindow> window_;
- scoped_nsobject<NSWindow> fullscreen_window_;
+ NSWindow* savedRegularWindow_;
scoped_ptr<TabStripModelObserverBridge> tabObserver_;
scoped_ptr<BrowserWindowCocoa> windowShim_;
scoped_nsobject<ToolbarController> toolbarController_;
@@ -65,14 +60,21 @@ class TabStripModelObserverBridge;
scoped_nsobject<TabStripController> tabStripController_;
scoped_nsobject<FindBarCocoaController> findBarCocoaController_;
scoped_nsobject<InfoBarContainerController> infoBarContainerController_;
- scoped_ptr<StatusBubbleMac> statusBubble_;
scoped_nsobject<DownloadShelfController> downloadShelfController_;
scoped_nsobject<ExtensionShelfController> extensionShelfController_;
scoped_nsobject<BookmarkBarController> bookmarkBarController_;
- scoped_nsobject<BookmarkBubbleController> bookmarkBubbleController_;
+
+ // Strong. StatusBubble is a special case of a strong reference that
+ // we don't wrap in a scoped_ptr because it is acting the same
+ // as an NSWindowController in that it wraps a window that must
+ // be shut down before our destructors are called.
+ StatusBubbleMac* statusBubble_;
+
+ // Strong. We don't wrap it in scoped_nsobject because we must close
+ // it appropriately in [windowWillClose:].
+ BookmarkBubbleController* bookmarkBubbleController_;
scoped_nsobject<GTMTheme> theme_;
BOOL ownsBrowser_; // Only ever NO when testing
- BOOL fullscreen_;
CGFloat verticalOffsetForStatusBubble_;
}
diff --git a/chrome/browser/cocoa/browser_window_controller.mm b/chrome/browser/cocoa/browser_window_controller.mm
index 7edf5b4..adfbb3e 100644
--- a/chrome/browser/cocoa/browser_window_controller.mm
+++ b/chrome/browser/cocoa/browser_window_controller.mm
@@ -61,10 +61,6 @@ const int kWindowGradientHeight = 24;
// Note: These functions are private, use -[NSObject respondsToSelector:]
// before calling them.
-- (void)setAutorecalculatesContentBorderThickness:(BOOL)b
- forEdge:(NSRectEdge)e;
-- (void)setContentBorderThickness:(CGFloat)b forEdge:(NSRectEdge)e;
-
- (void)setBottomCornerRounded:(BOOL)rounded;
- (NSRect)_growBoxRect;
@@ -117,18 +113,14 @@ willPositionSheet:(NSWindow*)sheet
ownsBrowser_ = ownIt;
tabObserver_.reset(
new TabStripModelObserverBridge(browser->tabstrip_model(), self));
- windowShim_.reset(new BrowserWindowCocoa(browser, self, [self window]));
+ NSWindow* window = [self window];
+ windowShim_.reset(new BrowserWindowCocoa(browser, self, window));
- // The window is now fully realized and |-windowDidLoad:| has been
- // called. We shouldn't do much in wDL because |windowShim_| won't yet
- // be initialized (as it's called in response to |[self window]| above).
- // Retain it per the comment in the header.
- window_.reset([[self window] retain]);
// Sets the window to not have rounded corners, which prevents
// the resize control from being inset slightly and looking ugly.
- if ([window_ respondsToSelector:@selector(setBottomCornerRounded:)])
- [window_ setBottomCornerRounded:NO];
+ if ([window respondsToSelector:@selector(setBottomCornerRounded:)])
+ [window setBottomCornerRounded:NO];
[self setTheme];
@@ -223,7 +215,7 @@ willPositionSheet:(NSWindow*)sheet
[self layoutSubviews];
// Create the bridge for the status bubble.
- statusBubble_.reset(new StatusBubbleMac([self window], self));
+ statusBubble_ = new StatusBubbleMac([self window], self);
}
return self;
}
@@ -235,10 +227,6 @@ willPositionSheet:(NSWindow*)sheet
// Under certain testing configurations we may not actually own the browser.
if (ownsBrowser_ == NO)
browser_.release();
- // Since |window_| outlives our obj-c shutdown sequence, clear out the
- // delegate so nothing tries to call us back in the meantime as part of
- // window destruction.
- [window_ setDelegate:nil];
[super dealloc];
}
@@ -252,7 +240,13 @@ willPositionSheet:(NSWindow*)sheet
[NSApp removeWindowsItem:[self window]];
// We need the window to go away now.
- [self autorelease];
+ // We can't actually use |-autorelease| here because there's an embedded
+ // run loop in the |-performClose:| which contains its own autorelease pool.
+ // Instead we use call it after a zero-length delay, which gets us back
+ // to the main event loop.
+ [self performSelector:@selector(autorelease)
+ withObject:nil
+ afterDelay:0];
}
// Called when the window meets the criteria to be closed (ie,
@@ -260,16 +254,14 @@ willPositionSheet:(NSWindow*)sheet
// semantics of BrowserWindow::Close() and not call the Browser's dtor directly
// from this method.
- (void)windowWillClose:(NSNotification*)notification {
- // Don't update the window any longer.
- // TODO(shess,dmaclach): This is a work-around for some cases where
- // the window's views were living longer than this controller, and
- // were then being re-displayed. Better would be to have it live
- // the appropriate amount of time, at which point we can remove
- // this. [And perhaps the funky -autorelease below can be fixed.]
- [window_ setAutodisplay:NO];
-
+ DCHECK_EQ([notification object], [self window]);
DCHECK(!browser_->tabstrip_model()->count());
-
+ [savedRegularWindow_ close];
+ [bookmarkBubbleController_ close];
+ // We delete statusBubble here because we need to kill off the dependency
+ // that its window has on our window before our window goes away.
+ delete statusBubble_;
+ statusBubble_ = NULL;
// We can't actually use |-autorelease| here because there's an embedded
// run loop in the |-performClose:| which contains its own autorelease pool.
// Instead we call it after a zero-length delay, which gets us back
@@ -351,8 +343,7 @@ willPositionSheet:(NSWindow*)sheet
// message, since it just means that a menu extra (on the "system status bar")
// was activated; we'll get another |-windowDidResignKey| if we ever really
// lose key window status.
- if ([NSApp isActive] &&
- ([NSApp keyWindow] == static_cast<NSWindow*>(window_)))
+ if ([NSApp isActive] && ([NSApp keyWindow] == [self window]))
return;
// We need to deactivate the controls (in the "WebView"). To do this, get the
@@ -425,6 +416,10 @@ willPositionSheet:(NSWindow*)sheet
return frame;
}
+- (void)activate {
+ [[self window] makeKeyAndOrderFront:self];
+}
+
// Determine whether we should let a window zoom/unzoom to the given |newFrame|.
// We avoid letting unzoom move windows between screens, because it's really
// strange and unintuitive.
@@ -643,7 +638,7 @@ willPositionSheet:(NSWindow*)sheet
}
- (StatusBubbleMac*)statusBubble {
- return statusBubble_.get();
+ return statusBubble_;
}
- (void)updateToolbarWithContents:(TabContents*)tab
@@ -660,13 +655,14 @@ willPositionSheet:(NSWindow*)sheet
// in the coordinate system of the content area of the currently selected tab.
// |windowGrowBox| needs to be in the window's coordinate system.
- (NSRect)selectedTabGrowBoxRect {
- if (![window_ respondsToSelector:@selector(_growBoxRect)])
+ NSWindow* window = [self window];
+ if (![window respondsToSelector:@selector(_growBoxRect)])
return NSZeroRect;
// Before we return a rect, we need to convert it from window coordinates
// to tab content area coordinates and flip the coordinate system.
NSRect growBoxRect =
- [[self tabContentArea] convertRect:[window_ _growBoxRect] fromView:nil];
+ [[self tabContentArea] convertRect:[window _growBoxRect] fromView:nil];
growBoxRect.origin.y =
[[self tabContentArea] frame].size.height - growBoxRect.size.height -
growBoxRect.origin.y;
@@ -769,17 +765,6 @@ willPositionSheet:(NSWindow*)sheet
[toolbarController_ setIsLoading:isLoading];
}
-- (void)activate {
- // TODO(rohitrao): Figure out the proper activation behavior for fullscreen
- // windows. When there is only one window open, this code makes sense, but
- // what should we do if we need to activate a non-fullscreen background window
- // while a fullscreen window has focus? http://crbug.com/24893
- if (fullscreen_)
- [fullscreen_window_ makeKeyAndOrderFront:self];
- else
- [window_ makeKeyAndOrderFront:self];
-}
-
// Make the location bar the first responder, if possible.
- (void)focusLocationBar {
[toolbarController_ focusLocationBar];
@@ -934,64 +919,48 @@ willPositionSheet:(NSWindow*)sheet
if (![self supportsFullscreen])
return;
- fullscreen_ = fullscreen;
+ NSWindow* window = [self window];
+
+ // Retain the contentView while we remove it from its superview.
+ scoped_nsobject<NSView> content([[window contentView] retain]);
+
+ // Disable autoresizing of subviews while we move views around. This
+ // prevents spurious renderer resizes.
+ [content setAutoresizesSubviews:NO];
+ [content removeFromSuperview];
+
+ NSWindow* dstWindow = nil;
if (fullscreen) {
- // Move content to a new fullscreen window
- NSView* content = [[self window] contentView];
- // Disable autoresizing of subviews while we move views around. This
- // prevents spurious renderer resizes.
- [content setAutoresizesSubviews:NO];
- fullscreen_window_.reset([[self fullscreenWindow] retain]);
- [content removeFromSuperview];
- [fullscreen_window_ setContentView:content];
- [self setWindow:fullscreen_window_.get()];
- [window_ setWindowController:nil];
- [window_ setDelegate:nil];
- // Required for proper event dispatch.
- [fullscreen_window_ setWindowController:self];
- [fullscreen_window_ setDelegate:self];
-
- // Minimize our UI. This call triggers a relayout, so it needs to come
- // after we move the contentview to the new window.
- [self adjustUIForFullscreen:fullscreen];
- // Show one window, hide the other.
- [fullscreen_window_ makeKeyAndOrderFront:self];
- [content setAutoresizesSubviews:YES];
- [content setNeedsDisplay:YES];
- [window_ orderOut:self];
+ DCHECK(!savedRegularWindow_);
+ savedRegularWindow_ = [window retain];
+ dstWindow = [self fullscreenWindow];
} else {
- NSView* content = [fullscreen_window_ contentView];
- // Disable autoresizing of subviews while we move views around. This
- // prevents spurious renderer resizes.
- [content setAutoresizesSubviews:NO];
- [content removeFromSuperview];
- [window_ setContentView:content];
- [fullscreen_window_ setDelegate:nil];
- [fullscreen_window_ setWindowController:nil];
- [window_ setWindowController:self];
- [window_ setDelegate:self];
- [self setWindow:window_.get()];
- // This call triggers a relayout, so it needs to come after we move the
- // contentview to the new window.
- [self adjustUIForFullscreen:fullscreen];
- [content setAutoresizesSubviews:YES];
- [content setNeedsDisplay:YES];
-
- // With this call, valgrind yells at me about "Conditional jump or
- // move depends on uninitialised value(s)". The error happens in
- // -[NSThemeFrame drawOverlayRect:]. I'm pretty convinced this is
- // an Apple bug, but there is no visual impact. I have been
- // unable to tickle it away with other window or view manipulation
- // Cocoa calls. Stack added to suppressions_mac.txt.
- [window_ makeKeyAndOrderFront:self];
-
- [fullscreen_window_ close];
- fullscreen_window_.reset(nil);
+ DCHECK(savedRegularWindow_);
+ dstWindow = [savedRegularWindow_ autorelease];
+ savedRegularWindow_ = nil;
}
+
+ // With this call, valgrind yells at me about "Conditional jump or
+ // move depends on uninitialised value(s)". The error happens in
+ // -[NSThemeFrame drawOverlayRect:]. I'm pretty convinced this is
+ // an Apple bug, but there is no visual impact. I have been
+ // unable to tickle it away with other window or view manipulation
+ // Cocoa calls. Stack added to suppressions_mac.txt.
+ [content setAutoresizesSubviews:YES];
+ [dstWindow setContentView:content];
+ [window setWindowController:nil];
+ [window setDelegate:nil];
+ [self setWindow:dstWindow];
+ [dstWindow setWindowController:self];
+ [dstWindow setDelegate:self];
+ [self adjustUIForFullscreen:fullscreen];
+ [dstWindow makeKeyAndOrderFront:self];
+
+ [window orderOut:self];
}
- (BOOL)isFullscreen {
- return fullscreen_;
+ return savedRegularWindow_ != nil;
}
// Called by the bookmark bar to open a URL.
@@ -1094,25 +1063,37 @@ willPositionSheet:(NSWindow*)sheet
// Show the bookmark bubble (e.g. user just clicked on the STAR).
- (void)showBookmarkBubbleForURL:(const GURL&)url
alreadyBookmarked:(BOOL)alreadyBookmarked {
- BookmarkModel* model = browser_->profile()->GetBookmarkModel();
- const BookmarkNode* node = model->GetMostRecentlyAddedNodeForURL(url);
-
- // Bring up the bubble. But clicking on STAR while the bubble is
- // open should make it go away.
- if (bookmarkBubbleController_.get()) {
- [self doneWithBubbleController:bookmarkBubbleController_.get()];
- } else {
- bookmarkBubbleController_.reset([[BookmarkBubbleController alloc]
- initWithDelegate:self
- parentWindow:[self window]
- topLeftForBubble:[self topLeftForBubble]
- model:model
- node:node
- alreadyBookmarked:alreadyBookmarked]);
- [bookmarkBubbleController_ showWindow];
+ if (!bookmarkBubbleController_) {
+ BookmarkModel* model = browser_->profile()->GetBookmarkModel();
+ const BookmarkNode* node = model->GetMostRecentlyAddedNodeForURL(url);
+ NSPoint topLeft = [self topLeftForBubble];
+ bookmarkBubbleController_ =
+ [[BookmarkBubbleController alloc] initWithDelegate:self
+ parentWindow:[self window]
+ topLeftForBubble:topLeft
+ model:model
+ node:node
+ alreadyBookmarked:alreadyBookmarked];
+ NSWindow* bookmarkBubbleWindow = [bookmarkBubbleController_ window];
+ NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
+ [nc addObserver:self
+ selector:@selector(bubbleWindowWillClose:)
+ name:NSWindowWillCloseNotification
+ object:bookmarkBubbleWindow];
+ [bookmarkBubbleController_ showWindow:self];
}
}
+// Notification sent when our bubble window is closed.
+- (void)bubbleWindowWillClose:(NSNotification*)notification {
+ DCHECK([[notification object] windowController] == bookmarkBubbleController_);
+ NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
+ [nc removeObserver:self
+ name:NSWindowWillCloseNotification
+ object:[bookmarkBubbleController_ window]];
+ bookmarkBubbleController_ = nil;
+}
+
// Implement BookmarkBubbleControllerDelegate
- (void)editBookmarkNode:(const BookmarkNode*)node {
// A BookmarkEditorController is a sheet that owns itself, and
@@ -1127,17 +1108,14 @@ willPositionSheet:(NSWindow*)sheet
runAsModalSheet];
}
-// Implement BookmarkBubbleControllerDelegate
-- (void)doneWithBubbleController:(BookmarkBubbleController*)controller {
- bookmarkBubbleController_.reset(nil);
-}
// Delegate method called when window is resized.
- (void)windowDidResize:(NSNotification*)notification {
// Resize (and possibly move) the status bubble. Note that we may get called
// when the status bubble does not exist.
- if (statusBubble_.get())
+ if (statusBubble_) {
statusBubble_->UpdateSizeAndPosition();
+ }
}
@end
@@ -1296,25 +1274,27 @@ willPositionSheet:(NSWindow*)sheet
// the entire content area. Otherwise, this method places the topmost view
// directly beneath the tabstrip.
- (void)layoutSubviews {
- NSView* contentView = fullscreen_ ? [fullscreen_window_ contentView]
- : [[self window] contentView];
+ NSWindow* window = [self window];
+ NSView* contentView = [window contentView];
NSRect contentFrame = [contentView frame];
int maxY = NSMaxY(contentFrame);
int minY = NSMinY(contentFrame);
- if (!fullscreen_ && [self isNormalWindow]) {
+ if (![self isFullscreen] && [self isNormalWindow]) {
maxY = NSMinY([[self tabStripView] frame]);
}
DCHECK_GE(maxY, minY);
// Suppress title drawing for normal windows (popups use normal
// window title bars).
- [window_ setShouldHideTitle:[self isNormalWindow]];
+ if ([window respondsToSelector:@selector(setShouldHideTitle:)]) {
+ [(id)window setShouldHideTitle:[self isNormalWindow]];
+ }
// Place the toolbar at the top of the reserved area, but only if we're not in
// fullscreen mode.
NSView* toolbarView = [toolbarController_ view];
NSRect toolbarFrame = [toolbarView frame];
- if (!fullscreen_) {
+ if (![self isFullscreen]) {
// The toolbar is present in the window, so we make room for it.
toolbarFrame.origin.x = 0;
toolbarFrame.origin.y = maxY - NSHeight(toolbarFrame);
diff --git a/chrome/browser/cocoa/browser_window_controller_unittest.mm b/chrome/browser/cocoa/browser_window_controller_unittest.mm
index 4df1482..5533453 100644
--- a/chrome/browser/cocoa/browser_window_controller_unittest.mm
+++ b/chrome/browser/cocoa/browser_window_controller_unittest.mm
@@ -6,6 +6,7 @@
#include "base/scoped_nsautorelease_pool.h"
#include "base/scoped_ptr.h"
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_window.h"
#include "chrome/browser/cocoa/browser_test_helper.h"
#include "chrome/browser/cocoa/browser_window_controller.h"
#include "chrome/browser/cocoa/cocoa_test_helper.h"
@@ -14,7 +15,6 @@
#include "chrome/common/pref_service.h"
#include "chrome/test/testing_browser_process.h"
#include "chrome/test/testing_profile.h"
-#include "testing/gtest/include/gtest/gtest.h"
@interface BrowserWindowController (JustForTesting)
// Already defined in BWC.
@@ -57,21 +57,23 @@
}
@end
-class BrowserWindowControllerTest : public testing::Test {
+class BrowserWindowControllerTest : public CocoaTest {
+ public:
virtual void SetUp() {
- controller_.reset([[BrowserWindowController alloc]
- initWithBrowser:browser_helper_.browser()
- takeOwnership:NO]);
+ CocoaTest::SetUp();
+ Browser* browser = browser_helper_.browser();
+ controller_ = [[BrowserWindowController alloc] initWithBrowser:browser
+ takeOwnership:NO];
+ }
+
+ virtual void TearDown() {
+ [controller_ close];
+ CocoaTest::TearDown();
}
public:
- // Order is very important here. We want the controller deleted
- // before the pool, and want the pool deleted before
- // BrowserTestHelper.
- CocoaTestHelper cocoa_helper_;
BrowserTestHelper browser_helper_;
- base::ScopedNSAutoreleasePool pool_;
- scoped_nsobject<BrowserWindowController> controller_;
+ BrowserWindowController* controller_;
};
TEST_F(BrowserWindowControllerTest, TestSaveWindowPosition) {
@@ -89,70 +91,12 @@ TEST_F(BrowserWindowControllerTest, TestSaveWindowPosition) {
EXPECT_TRUE(prefs->GetDictionary(prefs::kBrowserWindowPlacement) != NULL);
}
-@interface BrowserWindowControllerFakeFullscreen : BrowserWindowController {
- @private
- // We release the window ourselves, so we don't have to rely on the unittest
- // doing it for us.
- scoped_nsobject<NSWindow> fullscreenWindow_;
-}
-@end
-@implementation BrowserWindowControllerFakeFullscreen
-// Override fullscreenWindow to return a dummy window. This isn't needed to
-// pass the test, but because the dummy window is only 100x100, it prevents the
-// real fullscreen window from flashing up and taking over the whole screen..
-// We have to return an actual window because layoutSubviews: looks at the
-// window's frame.
-- (NSWindow*)fullscreenWindow {
- if (fullscreenWindow_.get())
- return fullscreenWindow_.get();
-
- fullscreenWindow_.reset(
- [[NSWindow alloc] initWithContentRect:NSMakeRect(0,0,400,400)
- styleMask:NSBorderlessWindowMask
- backing:NSBackingStoreBuffered
- defer:NO]);
- [fullscreenWindow_ setReleasedWhenClosed:NO];
- return fullscreenWindow_.get();
-}
-@end
-
-TEST_F(BrowserWindowControllerTest, TestFullscreen) {
- // Note use of "controller", not "controller_"
- scoped_nsobject<BrowserWindowController> controller;
- controller.reset([[BrowserWindowControllerFakeFullscreen alloc]
- initWithBrowser:browser_helper_.browser()
- takeOwnership:NO]);
- EXPECT_FALSE([controller isFullscreen]);
- [controller setFullscreen:YES];
- EXPECT_TRUE([controller isFullscreen]);
- [controller setFullscreen:NO];
- EXPECT_FALSE([controller isFullscreen]);
-
- // Confirm the real fullscreen command doesn't return nil
+TEST_F(BrowserWindowControllerTest, TestFullScreenWindow) {
+ // Confirm the fullscreen command doesn't return nil.
+ // See BrowserWindowFullScreenControllerTest for more fullscreen tests.
EXPECT_TRUE([controller_ fullscreenWindow]);
}
-TEST_F(BrowserWindowControllerTest, TestActivate) {
- // Note use of "controller", not "controller_"
- scoped_nsobject<BrowserWindowController> controller;
- controller.reset([[BrowserWindowControllerFakeFullscreen alloc]
- initWithBrowser:browser_helper_.browser()
- takeOwnership:NO]);
- EXPECT_FALSE([controller isFullscreen]);
-
- [controller activate];
- NSWindow* frontmostWindow = [[NSApp orderedWindows] objectAtIndex:0];
- EXPECT_EQ(frontmostWindow, [controller window]);
-
- [controller setFullscreen:YES];
- [controller activate];
- frontmostWindow = [[NSApp orderedWindows] objectAtIndex:0];
- EXPECT_EQ(frontmostWindow, [controller fullscreenWindow]);
-
- // We have to cleanup after ourselves by unfullscreening.
- [controller setFullscreen:NO];
-}
-
TEST_F(BrowserWindowControllerTest, TestNormal) {
// Force the bookmark bar to be shown.
browser_helper_.profile()->GetPrefs()->
@@ -163,18 +107,15 @@ TEST_F(BrowserWindowControllerTest, TestNormal) {
EXPECT_TRUE([controller_ isBookmarkBarVisible]);
// And make sure a controller for a pop-up window is not normal.
- scoped_ptr<Browser> popup_browser(Browser::CreateForPopup(
- browser_helper_.profile()));
- controller_.reset([[BrowserWindowController alloc]
- initWithBrowser:popup_browser.get()
- takeOwnership:NO]);
- EXPECT_FALSE([controller_ isNormalWindow]);
- EXPECT_FALSE([controller_ isBookmarkBarVisible]);
-
- // The created BrowserWindowController gets autoreleased, so make
- // sure we don't also release it.
- // (Confirmed with valgrind).
- controller_.release();
+ // popup_browser will be owned by its window.
+ Browser *popup_browser(Browser::CreateForPopup(browser_helper_.profile()));
+ NSWindow *cocoaWindow = popup_browser->window()->GetNativeHandle();
+ BrowserWindowController* controller =
+ static_cast<BrowserWindowController*>([cocoaWindow windowController]);
+ ASSERT_TRUE([controller isKindOfClass:[BrowserWindowController class]]);
+ EXPECT_FALSE([controller isNormalWindow]);
+ EXPECT_FALSE([controller isBookmarkBarVisible]);
+ [controller close];
}
@interface GTMTheme (BrowserThemeProviderInitialization)
@@ -470,23 +411,93 @@ TEST_F(BrowserWindowControllerTest, TestZoomFrame) {
TEST_F(BrowserWindowControllerTest, TestFindBarOnTop) {
FindBarBridge bridge;
- [controller_.get() addFindBar:bridge.find_bar_cocoa_controller()];
+ [controller_ addFindBar:bridge.find_bar_cocoa_controller()];
// Test that the Z-order of the find bar is on top of everything.
- NSArray* subviews = [[[controller_.get() window] contentView] subviews];
+ NSArray* subviews = [[[controller_ window] contentView] subviews];
NSUInteger findBar_index =
- [subviews indexOfObject:[controller_.get() findBarView]];
+ [subviews indexOfObject:[controller_ findBarView]];
EXPECT_NE(NSNotFound, findBar_index);
NSUInteger toolbar_index =
- [subviews indexOfObject:[controller_.get() toolbarView]];
+ [subviews indexOfObject:[controller_ toolbarView]];
EXPECT_NE(NSNotFound, toolbar_index);
NSUInteger bookmark_index =
- [subviews indexOfObject:[controller_.get() bookmarkView]];
+ [subviews indexOfObject:[controller_ bookmarkView]];
EXPECT_NE(NSNotFound, bookmark_index);
EXPECT_GT(findBar_index, toolbar_index);
EXPECT_GT(findBar_index, bookmark_index);
}
+@interface BrowserWindowControllerFakeFullscreen : BrowserWindowController {
+ @private
+ // We release the window ourselves, so we don't have to rely on the unittest
+ // doing it for us.
+ scoped_nsobject<NSWindow> fullscreenWindow_;
+}
+@end
+
+class BrowserWindowFullScreenControllerTest : public CocoaTest {
+ public:
+ virtual void SetUp() {
+ CocoaTest::SetUp();
+ Browser* browser = browser_helper_.browser();
+ controller_ =
+ [[BrowserWindowControllerFakeFullscreen alloc] initWithBrowser:browser
+ takeOwnership:NO];
+ }
+
+ virtual void TearDown() {
+ [controller_ close];
+ CocoaTest::TearDown();
+ }
+
+ public:
+ BrowserTestHelper browser_helper_;
+ BrowserWindowController* controller_;
+};
+
+TEST_F(BrowserWindowFullScreenControllerTest, TestFullscreen) {
+ EXPECT_FALSE([controller_ isFullscreen]);
+ [controller_ setFullscreen:YES];
+ EXPECT_TRUE([controller_ isFullscreen]);
+ [controller_ setFullscreen:NO];
+ EXPECT_FALSE([controller_ isFullscreen]);
+}
+
+TEST_F(BrowserWindowFullScreenControllerTest, TestActivate) {
+ EXPECT_FALSE([controller_ isFullscreen]);
+
+ [controller_ activate];
+ NSWindow* frontmostWindow = [[NSApp orderedWindows] objectAtIndex:0];
+ EXPECT_EQ(frontmostWindow, [controller_ window]);
+
+ [controller_ setFullscreen:YES];
+ [controller_ activate];
+ frontmostWindow = [[NSApp orderedWindows] objectAtIndex:0];
+ EXPECT_EQ(frontmostWindow, [controller_ fullscreenWindow]);
+
+ // We have to cleanup after ourselves by unfullscreening.
+ [controller_ setFullscreen:NO];
+}
+
+@implementation BrowserWindowControllerFakeFullscreen
+// Override fullscreenWindow to return a dummy window. This isn't needed to
+// pass the test, but because the dummy window is only 100x100, it prevents the
+// real fullscreen window from flashing up and taking over the whole screen..
+// We have to return an actual window because layoutSubviews: looks at the
+// window's frame.
+- (NSWindow*)fullscreenWindow {
+ if (fullscreenWindow_.get())
+ return fullscreenWindow_.get();
+
+ fullscreenWindow_.reset(
+ [[NSWindow alloc] initWithContentRect:NSMakeRect(0,0,400,400)
+ styleMask:NSBorderlessWindowMask
+ backing:NSBackingStoreBuffered
+ defer:NO]);
+ return fullscreenWindow_.get();
+}
+@end
/* TODO(???): test other methods of BrowserWindowController */
diff --git a/chrome/browser/cocoa/bubble_view_unittest.mm b/chrome/browser/cocoa/bubble_view_unittest.mm
index 2c949b5..d4179af 100644
--- a/chrome/browser/cocoa/bubble_view_unittest.mm
+++ b/chrome/browser/cocoa/bubble_view_unittest.mm
@@ -2,48 +2,34 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#import <Cocoa/Cocoa.h>
#include "base/scoped_nsobject.h"
#import "chrome/browser/cocoa/bubble_view.h"
#include "chrome/browser/cocoa/cocoa_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-class BubbleViewTest : public PlatformTest {
+class BubbleViewTest : public CocoaTest {
public:
BubbleViewTest() {
NSRect frame = NSMakeRect(0, 0, 50, 50);
- view_.reset([[BubbleView alloc] initWithFrame:frame
- themeProvider:cocoa_helper_.window()]);
- [cocoa_helper_.contentView() addSubview:view_.get()];
+ scoped_nsobject<BubbleView> view(
+ [[BubbleView alloc] initWithFrame:frame themeProvider:test_window()]);
+ view_ = view.get();
+ [[test_window() contentView] addSubview:view_];
[view_ setContent:@"Hi there, I'm a bubble view"];
}
- CocoaTestHelper cocoa_helper_;
- scoped_nsobject<BubbleView> view_;
+ BubbleView* view_;
};
-// Test adding/removing from the view hierarchy, mostly to ensure nothing
-// leaks or crashes.
-TEST_F(BubbleViewTest, AddRemove) {
- EXPECT_EQ(cocoa_helper_.contentView(), [view_ superview]);
- [view_.get() removeFromSuperview];
- EXPECT_FALSE([view_ superview]);
-}
-
-// Test drawing, mostly to ensure nothing leaks or crashes.
-TEST_F(BubbleViewTest, Display) {
- [view_ display];
-}
+TEST_VIEW(BubbleViewTest, view_);
// Test a nil themeProvider in init.
TEST_F(BubbleViewTest, NilThemeProvider) {
NSRect frame = NSMakeRect(0, 0, 50, 50);
- view_.reset([[BubbleView alloc] initWithFrame:frame
- themeProvider:nil]);
- [cocoa_helper_.contentView() addSubview:view_.get()];
- [view_ display];
+ scoped_nsobject<BubbleView> view(
+ [[BubbleView alloc] initWithFrame:frame themeProvider:nil]);
+ [[test_window() contentView] addSubview:view.get()];
+ [view display];
}
// Make sure things don't go haywire when given invalid or long strings.
diff --git a/chrome/browser/cocoa/cocoa_test_helper.h b/chrome/browser/cocoa/cocoa_test_helper.h
index f980790..5b05505 100644
--- a/chrome/browser/cocoa/cocoa_test_helper.h
+++ b/chrome/browser/cocoa/cocoa_test_helper.h
@@ -105,15 +105,15 @@ class CocoaTest : public PlatformTest {
// displaying the view to make sure it won't crash, as well as removing it
// from a window. All tests that work with NSView subclasses and/or
// NSViewController subclasses should use it.
-#define TEST_VIEW(test_fixture, view_member_name) \
+#define TEST_VIEW(test_fixture, test_view) \
TEST_F(test_fixture, AddRemove##test_fixture) { \
- scoped_nsobject<NSView> view([view_member_name retain]); \
- EXPECT_EQ([test_window() contentView], [view_member_name superview]); \
- [view_member_name removeFromSuperview]; \
- EXPECT_FALSE([view_member_name superview]); \
+ scoped_nsobject<NSView> view([test_view retain]); \
+ EXPECT_EQ([test_window() contentView], [view superview]); \
+ [view removeFromSuperview]; \
+ EXPECT_FALSE([view superview]); \
} \
TEST_F(test_fixture, Display##test_fixture) { \
- [view_member_name display]; \
+ [test_view display]; \
}
// The classes below are deprecated and will be removed shortly. Do not write
diff --git a/chrome/browser/cocoa/sad_tab_view_unittest.mm b/chrome/browser/cocoa/sad_tab_view_unittest.mm
index 382fdb6..7daddd3 100644
--- a/chrome/browser/cocoa/sad_tab_view_unittest.mm
+++ b/chrome/browser/cocoa/sad_tab_view_unittest.mm
@@ -20,6 +20,6 @@ class SadTabViewTest : public CocoaTest {
SadTabView* view_; // Weak. Owned by the view hierarchy.
};
-TEST_VIEW(SadTabViewTest, view_)
+TEST_VIEW(SadTabViewTest, view_);
} // namespace