summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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