Mac: Hook up the page menu's "Encoding" submenu.

Hook the NSMenu's delegate up to the ToolbarController in the nib and
generalize EncodingMenuControllerDelegate to work with a NSMenu
object instead of grabbing the app menu.

BUG=22639
TEST=ToolbarControllerTest.PopulateEncodingMenu

Review URL: http://codereview.chromium.org/225016

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27008 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/app/nibs/Toolbar.xib b/chrome/app/nibs/Toolbar.xib
index 93d1f82..4e7cca6 100644
--- a/chrome/app/nibs/Toolbar.xib
+++ b/chrome/app/nibs/Toolbar.xib
@@ -2,15 +2,15 @@
 <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.34</string>
-		<string key="IBDocument.HIToolboxVersion">352.00</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="48"/>
 			<integer value="1"/>
-			<integer value="42"/>
+			<integer value="67"/>
+			<integer value="48"/>
 		</object>
 		<object class="NSArray" key="IBDocument.PluginDependencies">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -458,14 +458,6 @@
 							<string key="NSTitle">^IDS_ENCODING_MENU</string>
 							<object class="NSMutableArray" key="NSMenuItems">
 								<bool key="EncodedWithXMLCoder">YES</bool>
-								<object class="NSMenuItem" id="1047175866">
-									<reference key="NSMenu" ref="1054137046"/>
-									<string key="NSTitle">Item</string>
-									<string key="NSKeyEquiv"/>
-									<int key="NSMnemonicLoc">2147483647</int>
-									<reference key="NSOnImage" ref="610745052"/>
-									<reference key="NSMixedImage" ref="1070349142"/>
-								</object>
 							</object>
 						</object>
 					</object>
@@ -1033,6 +1025,14 @@
 					</object>
 					<int key="connectionID">126</int>
 				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBOutletConnection" key="connection">
+						<string key="label">encodingMenu_</string>
+						<reference key="source" ref="1001"/>
+						<reference key="destination" ref="1054137046"/>
+					</object>
+					<int key="connectionID">134</int>
+				</object>
 			</object>
 			<object class="IBMutableOrderedSet" key="objectRecords">
 				<object class="NSArray" key="orderedObjects">
@@ -1386,16 +1386,10 @@
 						<reference key="object" ref="1054137046"/>
 						<object class="NSMutableArray" key="children">
 							<bool key="EncodedWithXMLCoder">YES</bool>
-							<reference ref="1047175866"/>
 						</object>
 						<reference key="parent" ref="275495410"/>
 					</object>
 					<object class="IBObjectRecord">
-						<int key="objectID">68</int>
-						<reference key="object" ref="1047175866"/>
-						<reference key="parent" ref="1054137046"/>
-					</object>
-					<object class="IBObjectRecord">
 						<int key="objectID">69</int>
 						<reference key="object" ref="966232471"/>
 						<reference key="parent" ref="1035953805"/>
@@ -1571,7 +1565,6 @@
 					<string>66.IBPluginDependency</string>
 					<string>67.IBEditorWindowLastContentRect</string>
 					<string>67.IBPluginDependency</string>
-					<string>68.IBPluginDependency</string>
 					<string>69.IBPluginDependency</string>
 					<string>7.CustomClassName</string>
 					<string>7.IBAttributePlaceholdersKey</string>
@@ -1678,7 +1671,7 @@
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>{{413, 523}, {306, 233}}</string>
+					<string>{{362, 523}, {306, 233}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1692,17 +1685,16 @@
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>{{904, 813}, {202, 63}}</string>
+					<string>{{404, 503}, {202, 63}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>{{904, 573}, {204, 63}}</string>
+					<string>{{404, 453}, {204, 63}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-					<string>{{904, 833}, {86, 23}}</string>
-					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+					<string>{{404, 540}, {64, 6}}</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
 					<string>DelayedMenuButton</string>
@@ -1757,7 +1749,7 @@
 				</object>
 			</object>
 			<nil key="sourceID"/>
-			<int key="maxID">133</int>
+			<int key="maxID">134</int>
 		</object>
 		<object class="IBClassDescriber" key="IBDocument.Classes">
 			<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -1770,14 +1762,12 @@
 						<object class="NSMutableArray" key="dict.sortedKeys">
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<string>orderFrontStandardAboutPanel:</string>
-							<string>quit:</string>
 							<string>showPreferences:</string>
 						</object>
 						<object class="NSMutableArray" key="dict.values">
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<string>id</string>
 							<string>id</string>
-							<string>id</string>
 						</object>
 					</object>
 					<object class="NSMutableDictionary" key="outlets">
@@ -1920,6 +1910,13 @@
 					</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 class="IBPartialClassDescription">
 					<string key="className">PreferencesWindowController</string>
 					<string key="superclassName">NSWindowController</string>
 					<object class="NSMutableDictionary" key="actions">
@@ -1930,7 +1927,9 @@
 							<string>clearData:</string>
 							<string>importData:</string>
 							<string>makeDefaultBrowser:</string>
+							<string>manageSearchEngines:</string>
 							<string>removeSelectedHomepages:</string>
+							<string>resetThemeToDefault:</string>
 							<string>showPreferences:</string>
 							<string>showSavedPasswords:</string>
 							<string>themesGallery:</string>
@@ -1947,6 +1946,8 @@
 							<string>id</string>
 							<string>id</string>
 							<string>id</string>
+							<string>id</string>
+							<string>id</string>
 						</object>
 					</object>
 					<object class="NSMutableDictionary" key="outlets">
@@ -2036,6 +2037,7 @@
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<string>backButton_</string>
 							<string>bookmarkBarDelegate_</string>
+							<string>encodingMenu_</string>
 							<string>forwardButton_</string>
 							<string>goButton_</string>
 							<string>homeButton_</string>
@@ -2050,6 +2052,7 @@
 							<bool key="EncodedWithXMLCoder">YES</bool>
 							<string>DelayedMenuButton</string>
 							<string>id</string>
+							<string>NSMenu</string>
 							<string>DelayedMenuButton</string>
 							<string>NSButton</string>
 							<string>NSButton</string>
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
index d8885d08..f2d1b2a 100644
--- a/chrome/browser/app_controller_mac.mm
+++ b/chrome/browser/app_controller_mac.mm
@@ -338,7 +338,11 @@
   // current locale (see http://crbug.com/7647 for details).
   // We need a valid g_browser_process to get the profile which is why we can't
   // call this from awakeFromNib.
-  EncodingMenuControllerDelegate::BuildEncodingMenu([self defaultProfile]);
+  NSMenu* view_menu = [[[NSApp mainMenu] itemWithTag:IDC_VIEW_MENU] submenu];
+  NSMenuItem* encoding_menu_item = [view_menu itemWithTag:IDC_ENCODING_MENU];
+  NSMenu *encoding_menu = [encoding_menu_item submenu];
+  EncodingMenuControllerDelegate::BuildEncodingMenu([self defaultProfile],
+                                                    encoding_menu);
 
   // Now that we're initialized we can open any URLs we've been holding onto.
   [self openPendingURLs];
diff --git a/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.h b/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.h
index a23b1aa7..882d54c7 100644
--- a/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.h
+++ b/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.h
@@ -7,6 +7,7 @@
 
 #include "base/basictypes.h"  // For DISALLOW_IMPLICIT_CONSTRUCTORS
 
+@class NSMenu;
 class Profile;
 
 // The Windows version of this class manages the Encoding Menu, but since Cocoa
@@ -14,7 +15,7 @@
 // the encoding menu.
 class EncodingMenuControllerDelegate {
  public:
-  static void BuildEncodingMenu(Profile *profile);
+  static void BuildEncodingMenu(Profile *profile, NSMenu* encoding_menu);
  private:
   DISALLOW_IMPLICIT_CONSTRUCTORS(EncodingMenuControllerDelegate);
 };
diff --git a/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.mm b/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.mm
index 92e576e..f20e157 100644
--- a/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.mm
+++ b/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.mm
@@ -33,14 +33,10 @@
 }  // namespace
 
 // static
-void EncodingMenuControllerDelegate::BuildEncodingMenu(Profile *profile) {
+void EncodingMenuControllerDelegate::BuildEncodingMenu(Profile *profile,
+                                                       NSMenu* encoding_menu) {
   DCHECK(profile);
 
-  // Get hold of the Cocoa encoding menu.
-  NSMenu* view_menu = [[[NSApp mainMenu] itemWithTag:IDC_VIEW_MENU] submenu];
-  NSMenuItem* encoding_menu_item = [view_menu itemWithTag:IDC_ENCODING_MENU];
-  NSMenu *encoding_menu = [encoding_menu_item submenu];
-
   typedef EncodingMenuController::EncodingMenuItemList EncodingMenuItemList;
   EncodingMenuItemList menuItems;
   EncodingMenuController controller;
diff --git a/chrome/browser/cocoa/toolbar_controller.h b/chrome/browser/cocoa/toolbar_controller.h
index f61822f..71467433 100644
--- a/chrome/browser/cocoa/toolbar_controller.h
+++ b/chrome/browser/cocoa/toolbar_controller.h
@@ -88,6 +88,7 @@
   IBOutlet MenuButton* pageButton_;
   IBOutlet MenuButton* wrenchButton_;
   IBOutlet AutocompleteTextField* locationBar_;
+  IBOutlet NSMenu* encodingMenu_;
 }
 
 // Initialize the toolbar and register for command updates. The profile is
diff --git a/chrome/browser/cocoa/toolbar_controller.mm b/chrome/browser/cocoa/toolbar_controller.mm
index 65350f7..579c5da 100644
--- a/chrome/browser/cocoa/toolbar_controller.mm
+++ b/chrome/browser/cocoa/toolbar_controller.mm
@@ -14,6 +14,7 @@
 #import "chrome/browser/cocoa/autocomplete_text_field.h"
 #import "chrome/browser/cocoa/autocomplete_text_field_editor.h"
 #import "chrome/browser/cocoa/back_forward_menu_controller.h"
+#import "chrome/browser/cocoa/encoding_menu_controller_delegate_mac.h"
 #import "chrome/browser/cocoa/gradient_button_cell.h"
 #import "chrome/browser/cocoa/location_bar_view_mac.h"
 #import "chrome/browser/cocoa/menu_button.h"
@@ -195,6 +196,8 @@
   // We want a dynamic tooltip on the go button, so tell the go button to ask
   // use for the tooltip
   [goButton_ addToolTipRect:[goButton_ bounds] owner:self userData:nil];
+
+  EncodingMenuControllerDelegate::BuildEncodingMenu(profile_, encodingMenu_);
 }
 - (void)removeFromSuperview {
   NSLog(@"remove");
@@ -378,7 +381,7 @@
 - (NSArray*)toolbarViews {
   return [NSArray arrayWithObjects:backButton_, forwardButton_, reloadButton_,
             homeButton_, starButton_, goButton_, pageButton_, wrenchButton_,
-            locationBar_, nil];
+            locationBar_, encodingMenu_, nil];
 }
 
 // Moves |rect| to the right by |delta|, keeping the right side fixed by
diff --git a/chrome/browser/cocoa/toolbar_controller_unittest.mm b/chrome/browser/cocoa/toolbar_controller_unittest.mm
index 9ba3236..fbcb0af 100644
--- a/chrome/browser/cocoa/toolbar_controller_unittest.mm
+++ b/chrome/browser/cocoa/toolbar_controller_unittest.mm
@@ -44,7 +44,7 @@
   // |-toolbarViews| method.
   enum {
     kBackIndex, kForwardIndex, kReloadIndex, kHomeIndex, kStarIndex, kGoIndex,
-    kPageIndex, kWrenchIndex, kLocationIndex,
+    kPageIndex, kWrenchIndex, kLocationIndex, kEncodingMenuIndex
   };
 
   ToolbarControllerTest() {
@@ -320,5 +320,13 @@
   EXPECT_TRUE([bar_ hoverButtonForEvent:nil]);
 }
 
+TEST_F(ToolbarControllerTest, PopulateEncodingMenu) {
+  NSMenu* encodings = [[bar_ toolbarViews] objectAtIndex:kEncodingMenuIndex];
+
+  // Can't check item strings because of localization, but the nib has zero
+  // items so check that we at least populated the menu with something at
+  // startup.
+  EXPECT_NE(0, [encodings numberOfItems]);
+}
 
 }  // namespace