diff options
-rw-r--r-- | chrome/app/nibs/ExtensionInstallPrompt.xib | 745 | ||||
-rw-r--r-- | chrome/app/nibs/ExtensionInstallPromptNoWarnings.xib | 575 | ||||
-rw-r--r-- | chrome/browser/cocoa/extensions/extension_install_prompt_controller.h | 61 | ||||
-rw-r--r-- | chrome/browser/cocoa/extensions/extension_install_prompt_controller.mm | 207 | ||||
-rw-r--r-- | chrome/browser/cocoa/extensions/extension_install_prompt_controller_unittest.mm | 296 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_install_ui.cc | 57 | ||||
-rwxr-xr-x | chrome/chrome_browser.gypi | 4 | ||||
-rw-r--r-- | chrome/chrome_dll.gypi | 2 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 1 | ||||
-rw-r--r-- | chrome/test/data/extensions/install_prompt/extension.json | 4 | ||||
-rw-r--r-- | chrome/test/data/extensions/install_prompt/icon.png | bin | 0 -> 647 bytes |
11 files changed, 1895 insertions, 57 deletions
diff --git a/chrome/app/nibs/ExtensionInstallPrompt.xib b/chrome/app/nibs/ExtensionInstallPrompt.xib new file mode 100644 index 0000000..81636e1 --- /dev/null +++ b/chrome/app/nibs/ExtensionInstallPrompt.xib @@ -0,0 +1,745 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03"> + <data> + <int key="IBDocument.SystemTarget">1050</int> + <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="112"/> + </object> + <object class="NSArray" key="IBDocument.PluginDependencies"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilderKit</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + <object class="NSMutableDictionary" key="IBDocument.Metadata"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <object class="NSMutableArray" key="IBDocument.RootObjects" id="110858478"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomObject" id="762632889"> + <string key="NSClassName">ExtensionInstallPromptController</string> + </object> + <object class="NSCustomObject" id="932410077"> + <string key="NSClassName">FirstResponder</string> + </object> + <object class="NSCustomObject" id="858592610"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSWindowTemplate" id="407942812"> + <int key="NSWindowStyleMask">7</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{196, 343}, {387, 167}}</string> + <int key="NSWTFlags">603979776</int> + <string key="NSWindowTitle">Window</string> + <string key="NSWindowClass">NSWindow</string> + <nil key="NSViewClass"/> + <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string> + <object class="NSView" key="NSWindowView" id="916011104"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTextField" id="116161706"> + <reference key="NSNextResponder" ref="916011104"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{94, 130}, {276, 17}}</string> + <reference key="NSSuperview" ref="916011104"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="765561203"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">272629760</int> + <string key="NSContents">Title</string> + <object class="NSFont" key="NSSupport"> + <string key="NSName">LucidaGrande-Bold</string> + <double key="NSSize">1.300000e+01</double> + <int key="NSfFlags">16</int> + </object> + <reference key="NSControlView" ref="116161706"/> + <object class="NSColor" key="NSBackgroundColor" id="106251383"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor" id="786843933"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlTextColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MAA</bytes> + </object> + </object> + </object> + </object> + <object class="NSTextField" id="845526622"> + <reference key="NSNextResponder" ref="916011104"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{94, 108}, {276, 14}}</string> + <reference key="NSSuperview" ref="916011104"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="545033131"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">272760832</int> + <string key="NSContents">^IDS_EXTENSION_PROMPT2_WILL_HAVE_ACCESS_TO</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="845526622"/> + <reference key="NSBackgroundColor" ref="106251383"/> + <reference key="NSTextColor" ref="786843933"/> + </object> + </object> + <object class="NSButton" id="658209583"> + <reference key="NSNextResponder" ref="916011104"/> + <int key="NSvFlags">289</int> + <string key="NSFrame">{{277, 12}, {96, 32}}</string> + <reference key="NSSuperview" ref="916011104"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="774013405"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">^IDS_EXTENSION_PROMPT_INSTALL_BUTTON</string> + <object class="NSFont" key="NSSupport" id="120564242"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">1.300000e+01</double> + <int key="NSfFlags">1044</int> + </object> + <reference key="NSControlView" ref="658209583"/> + <int key="NSButtonFlags">-2034876161</int> + <int key="NSButtonFlags2">129</int> + <object class="NSImage" key="NSNormalImage"> + <int key="NSImageFlags">549650432</int> + <string key="NSSize">{1, 1}</string> + <object class="NSMutableArray" key="NSReps"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <object class="NSBitmapImageRep"> + <object class="NSData" key="NSTIFFRepresentation"> + <bytes key="NS.bytes">TU0AKgAAAAoAAAANAQAAAwAAAAEAAQAAAQEAAwAAAAEAAQAAAQIAAwAAAAIACAAIAQMAAwAAAAEAAQAA +AQYAAwAAAAEAAQAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEAAgAAARYAAwAAAAEgAAAA +ARcABAAAAAEAAAACARwAAwAAAAEAAQAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes> + </object> + </object> + </object> + </object> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MCAwAA</bytes> + </object> + </object> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSButton" id="78143092"> + <reference key="NSNextResponder" ref="916011104"/> + <int key="NSvFlags">289</int> + <string key="NSFrame">{{181, 12}, {96, 32}}</string> + <reference key="NSSuperview" ref="916011104"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="694974848"> + <int key="NSCellFlags">-2080244224</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">^IDS_CANCEL</string> + <reference key="NSSupport" ref="120564242"/> + <reference key="NSControlView" ref="78143092"/> + <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="NSImageView" id="773187810"> + <reference key="NSNextResponder" ref="916011104"/> + <int key="NSvFlags">268</int> + <object class="NSMutableSet" key="NSDragTypes"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="set.sortedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>Apple PDF pasteboard type</string> + <string>Apple PICT pasteboard type</string> + <string>Apple PNG pasteboard type</string> + <string>NSFilenamesPboardType</string> + <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string> + <string>NeXT TIFF v4.0 pasteboard type</string> + </object> + </object> + <string key="NSFrame">{{17, 81}, {69, 69}}</string> + <reference key="NSSuperview" ref="916011104"/> + <bool key="NSEnabled">YES</bool> + <object class="NSImageCell" key="NSCell" id="770823139"> + <int key="NSCellFlags">130560</int> + <int key="NSCellFlags2">33554432</int> + <int key="NSAlign">0</int> + <int key="NSScale">0</int> + <int key="NSStyle">0</int> + <bool key="NSAnimates">NO</bool> + </object> + <bool key="NSEditable">YES</bool> + </object> + <object class="NSBox" id="149454278"> + <reference key="NSNextResponder" ref="916011104"/> + <int key="NSvFlags">12</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSView" id="832631316"> + <reference key="NSNextResponder" ref="149454278"/> + <int key="NSvFlags">256</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTextField" id="94278885"> + <reference key="NSNextResponder" ref="832631316"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{15, 14}, {247, 19}}</string> + <reference key="NSSuperview" ref="832631316"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="701936428"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">272760832</int> + <string key="NSContents">Permissions List</string> + <reference key="NSSupport" ref="26"/> + <reference key="NSControlView" ref="94278885"/> + <reference key="NSBackgroundColor" ref="106251383"/> + <reference key="NSTextColor" ref="786843933"/> + </object> + </object> + </object> + <string key="NSFrame">{{1, 1}, {277, 43}}</string> + <reference key="NSSuperview" ref="149454278"/> + </object> + </object> + <string key="NSFrame">{{91, 56}, {279, 59}}</string> + <reference key="NSSuperview" ref="916011104"/> + <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"/> + <object class="NSColor" key="NSBackgroundColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">textBackgroundColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MQA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes> + </object> + </object> + <reference key="NSContentView" ref="832631316"/> + <int key="NSBorderType">1</int> + <int key="NSBoxType">0</int> + <int key="NSTitlePosition">2</int> + <bool key="NSTransparent">NO</bool> + </object> + </object> + <string key="NSFrameSize">{387, 167}</string> + <reference key="NSSuperview"/> + </object> + <string key="NSScreenRect">{{0, 0}, {2560, 1578}}</string> + <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string> + </object> + <object class="NSCustomObject" id="936638122"> + <string key="NSClassName">ChromeUILocalizer</string> + </object> + <object class="NSCustomObject" id="423359922"> + <string key="NSClassName">GTMUILocalizerAndLayoutTweaker</string> + </object> + </object> + <object class="IBObjectContainer" key="IBDocument.Objects"> + <object class="NSMutableArray" key="connectionRecords"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">window</string> + <reference key="source" ref="762632889"/> + <reference key="destination" ref="407942812"/> + </object> + <int key="connectionID">132</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">cancel:</string> + <reference key="source" ref="762632889"/> + <reference key="destination" ref="78143092"/> + </object> + <int key="connectionID">133</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">ok:</string> + <reference key="source" ref="762632889"/> + <reference key="destination" ref="658209583"/> + </object> + <int key="connectionID">134</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">iconView_</string> + <reference key="source" ref="762632889"/> + <reference key="destination" ref="773187810"/> + </object> + <int key="connectionID">137</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">warningsField_</string> + <reference key="source" ref="762632889"/> + <reference key="destination" ref="94278885"/> + </object> + <int key="connectionID">139</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">localizer_</string> + <reference key="source" ref="423359922"/> + <reference key="destination" ref="936638122"/> + </object> + <int key="connectionID">142</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">uiObject_</string> + <reference key="source" ref="423359922"/> + <reference key="destination" ref="407942812"/> + </object> + <int key="connectionID">143</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">titleField_</string> + <reference key="source" ref="762632889"/> + <reference key="destination" ref="116161706"/> + </object> + <int key="connectionID">144</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">subtitleField_</string> + <reference key="source" ref="762632889"/> + <reference key="destination" ref="845526622"/> + </object> + <int key="connectionID">145</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">warningsBox_</string> + <reference key="source" ref="762632889"/> + <reference key="destination" ref="149454278"/> + </object> + <int key="connectionID">148</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">okButton_</string> + <reference key="source" ref="762632889"/> + <reference key="destination" ref="658209583"/> + </object> + <int key="connectionID">149</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">cancelButton_</string> + <reference key="source" ref="762632889"/> + <reference key="destination" ref="78143092"/> + </object> + <int key="connectionID">150</int> + </object> + </object> + <object class="IBMutableOrderedSet" key="objectRecords"> + <object class="NSArray" key="orderedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBObjectRecord"> + <int key="objectID">0</int> + <object class="NSArray" key="object" id="485438096"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <reference key="children" ref="110858478"/> + <nil key="parent"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-2</int> + <reference key="object" ref="762632889"/> + <reference key="parent" ref="485438096"/> + <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-1</int> + <reference key="object" ref="932410077"/> + <reference key="parent" ref="485438096"/> + <string key="objectName">First Responder</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-3</int> + <reference key="object" ref="858592610"/> + <reference key="parent" ref="485438096"/> + <string key="objectName">Application</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">111</int> + <reference key="object" ref="407942812"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="916011104"/> + </object> + <reference key="parent" ref="485438096"/> + <string key="objectName">Install Prompt</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">112</int> + <reference key="object" ref="916011104"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="116161706"/> + <reference ref="773187810"/> + <reference ref="845526622"/> + <reference ref="149454278"/> + <reference ref="78143092"/> + <reference ref="658209583"/> + </object> + <reference key="parent" ref="407942812"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">118</int> + <reference key="object" ref="116161706"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="765561203"/> + </object> + <reference key="parent" ref="916011104"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">119</int> + <reference key="object" ref="765561203"/> + <reference key="parent" ref="116161706"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">120</int> + <reference key="object" ref="845526622"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="545033131"/> + </object> + <reference key="parent" ref="916011104"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">121</int> + <reference key="object" ref="545033131"/> + <reference key="parent" ref="845526622"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">124</int> + <reference key="object" ref="658209583"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="774013405"/> + </object> + <reference key="parent" ref="916011104"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">125</int> + <reference key="object" ref="774013405"/> + <reference key="parent" ref="658209583"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">126</int> + <reference key="object" ref="78143092"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="694974848"/> + </object> + <reference key="parent" ref="916011104"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">127</int> + <reference key="object" ref="694974848"/> + <reference key="parent" ref="78143092"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">130</int> + <reference key="object" ref="773187810"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="770823139"/> + </object> + <reference key="parent" ref="916011104"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">131</int> + <reference key="object" ref="770823139"/> + <reference key="parent" ref="773187810"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">140</int> + <reference key="object" ref="936638122"/> + <reference key="parent" ref="485438096"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">141</int> + <reference key="object" ref="423359922"/> + <reference key="parent" ref="485438096"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">147</int> + <reference key="object" ref="149454278"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="94278885"/> + </object> + <reference key="parent" ref="916011104"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">128</int> + <reference key="object" ref="94278885"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="701936428"/> + </object> + <reference key="parent" ref="149454278"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">129</int> + <reference key="object" ref="701936428"/> + <reference key="parent" ref="94278885"/> + </object> + </object> + </object> + <object class="NSMutableDictionary" key="flattenedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>-1.IBPluginDependency</string> + <string>-2.IBPluginDependency</string> + <string>-3.IBPluginDependency</string> + <string>-3.ImportedFromIB2</string> + <string>111.IBEditorWindowLastContentRect</string> + <string>111.IBWindowTemplateEditedContentRect</string> + <string>111.NSWindowTemplate.visibleAtLaunch</string> + <string>112.IBPluginDependency</string> + <string>118.IBPluginDependency</string> + <string>119.IBPluginDependency</string> + <string>120.IBPluginDependency</string> + <string>121.IBPluginDependency</string> + <string>124.IBPluginDependency</string> + <string>125.IBPluginDependency</string> + <string>126.IBPluginDependency</string> + <string>127.IBPluginDependency</string> + <string>128.IBPluginDependency</string> + <string>129.IBPluginDependency</string> + <string>130.IBPluginDependency</string> + <string>131.IBPluginDependency</string> + <string>140.IBPluginDependency</string> + <string>141.IBPluginDependency</string> + <string>147.IBPluginDependency</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilderKit</string> + <string>com.apple.InterfaceBuilderKit</string> + <integer value="1"/> + <string>{{910, 848}, {387, 167}}</string> + <string>{{910, 848}, {387, 167}}</string> + <boolean value="NO"/> + <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>com.apple.InterfaceBuilder.CocoaPlugin</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>com.apple.InterfaceBuilder.CocoaPlugin</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>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + </object> + <object class="NSMutableDictionary" key="unlocalizedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <nil key="activeLocalization"/> + <object class="NSMutableDictionary" key="localizations"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <nil key="sourceID"/> + <int key="maxID">150</int> + </object> + <object class="IBClassDescriber" key="IBDocument.Classes"> + <object class="NSMutableArray" key="referencedPartialClassDescriptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBPartialClassDescription"> + <string key="className">ChromeUILocalizer</string> + <string key="superclassName">GTMUILocalizer</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">browser/cocoa/ui_localizer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">ExtensionInstallPromptController</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>cancel:</string> + <string>ok:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>id</string> + <string>id</string> + </object> + </object> + <object class="NSMutableDictionary" key="outlets"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>cancelButton_</string> + <string>iconView_</string> + <string>okButton_</string> + <string>subtitleField_</string> + <string>titleField_</string> + <string>warningsBox_</string> + <string>warningsField_</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSButton</string> + <string>NSImageView</string> + <string>NSButton</string> + <string>NSTextField</string> + <string>NSTextField</string> + <string>NSBox</string> + <string>NSTextField</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">browser/cocoa/extensions/extension_install_prompt_controller.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">GTMUILocalizer</string> + <string key="superclassName">NSObject</string> + <object class="NSMutableDictionary" key="outlets"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>otherObjectToLocalize_</string> + <string>owner_</string> + <string>yetAnotherObjectToLocalize_</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="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">../third_party/GTM/AppKit/GTMUILocalizer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">GTMUILocalizerAndLayoutTweaker</string> + <string key="superclassName">NSObject</string> + <object class="NSMutableDictionary" key="outlets"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>localizerOwner_</string> + <string>localizer_</string> + <string>uiObject_</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>id</string> + <string>GTMUILocalizer</string> + <string>id</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">../third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">browser/cocoa/status_bubble_mac.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <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/chrome_browser_window.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/themed_window.h</string> + </object> + </object> + </object> + </object> + <int key="IBDocument.localizationMode">0</int> + <string key="IBDocument.LastKnownRelativeProjectPath">../../chrome.xcodeproj</string> + <int key="IBDocument.defaultPropertyAccessControl">3</int> + </data> +</archive> diff --git a/chrome/app/nibs/ExtensionInstallPromptNoWarnings.xib b/chrome/app/nibs/ExtensionInstallPromptNoWarnings.xib new file mode 100644 index 0000000..f7569af --- /dev/null +++ b/chrome/app/nibs/ExtensionInstallPromptNoWarnings.xib @@ -0,0 +1,575 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03"> + <data> + <int key="IBDocument.SystemTarget">1050</int> + <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="2"/> + </object> + <object class="NSArray" key="IBDocument.PluginDependencies"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilderKit</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + <object class="NSMutableDictionary" key="IBDocument.Metadata"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomObject" id="1001"> + <string key="NSClassName">ExtensionInstallPromptController</string> + </object> + <object class="NSCustomObject" id="1003"> + <string key="NSClassName">FirstResponder</string> + </object> + <object class="NSCustomObject" id="1004"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSWindowTemplate" id="477128141"> + <int key="NSWindowStyleMask">7</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{196, 359}, {307, 151}}</string> + <int key="NSWTFlags">603979776</int> + <string key="NSWindowTitle">Window</string> + <string key="NSWindowClass">NSWindow</string> + <nil key="NSViewClass"/> + <object class="NSView" key="NSWindowView" id="955129256"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSImageView" id="561354826"> + <reference key="NSNextResponder" ref="955129256"/> + <int key="NSvFlags">268</int> + <object class="NSMutableSet" key="NSDragTypes"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="set.sortedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>Apple PDF pasteboard type</string> + <string>Apple PICT pasteboard type</string> + <string>Apple PNG pasteboard type</string> + <string>NSFilenamesPboardType</string> + <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string> + <string>NeXT TIFF v4.0 pasteboard type</string> + </object> + </object> + <string key="NSFrame">{{20, 62}, {69, 69}}</string> + <reference key="NSSuperview" ref="955129256"/> + <bool key="NSEnabled">YES</bool> + <object class="NSImageCell" key="NSCell" id="785962619"> + <int key="NSCellFlags">130560</int> + <int key="NSCellFlags2">33554432</int> + <int key="NSAlign">0</int> + <int key="NSScale">0</int> + <int key="NSStyle">0</int> + <bool key="NSAnimates">NO</bool> + </object> + <bool key="NSEditable">YES</bool> + </object> + <object class="NSTextField" id="592145570"> + <reference key="NSNextResponder" ref="955129256"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{104, 88}, {208, 17}}</string> + <reference key="NSSuperview" ref="955129256"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="530390105"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">272629760</int> + <string key="NSContents">Title</string> + <object class="NSFont" key="NSSupport"> + <string key="NSName">LucidaGrande-Bold</string> + <double key="NSSize">1.300000e+01</double> + <int key="NSfFlags">16</int> + </object> + <reference key="NSControlView" ref="592145570"/> + <object class="NSColor" key="NSBackgroundColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlTextColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MAA</bytes> + </object> + </object> + </object> + </object> + <object class="NSButton" id="806362510"> + <reference key="NSNextResponder" ref="955129256"/> + <int key="NSvFlags">289</int> + <string key="NSFrame">{{197, 12}, {96, 32}}</string> + <reference key="NSSuperview" ref="955129256"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="18743634"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">^IDS_EXTENSION_PROMPT_INSTALL_BUTTON</string> + <object class="NSFont" key="NSSupport" id="112225597"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">1.300000e+01</double> + <int key="NSfFlags">1044</int> + </object> + <reference key="NSControlView" ref="806362510"/> + <int key="NSButtonFlags">-2034876161</int> + <int key="NSButtonFlags2">129</int> + <object class="NSImage" key="NSNormalImage"> + <int key="NSImageFlags">549650432</int> + <string key="NSSize">{1, 1}</string> + <object class="NSMutableArray" key="NSReps"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <object class="NSBitmapImageRep"> + <object class="NSData" key="NSTIFFRepresentation"> + <bytes key="NS.bytes">TU0AKgAAAAoAAAANAQAAAwAAAAEAAQAAAQEAAwAAAAEAAQAAAQIAAwAAAAIACAAIAQMAAwAAAAEAAQAA +AQYAAwAAAAEAAQAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEAAgAAARYAAwAAAAEgAAAA +ARcABAAAAAEAAAACARwAAwAAAAEAAQAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes> + </object> + </object> + </object> + </object> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MCAwAA</bytes> + </object> + </object> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSButton" id="478302198"> + <reference key="NSNextResponder" ref="955129256"/> + <int key="NSvFlags">289</int> + <string key="NSFrame">{{101, 12}, {96, 32}}</string> + <reference key="NSSuperview" ref="955129256"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="745070348"> + <int key="NSCellFlags">-2080244224</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">^IDS_CANCEL</string> + <reference key="NSSupport" ref="112225597"/> + <reference key="NSControlView" ref="478302198"/> + <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> + <string key="NSFrameSize">{307, 151}</string> + <reference key="NSSuperview"/> + </object> + <string key="NSScreenRect">{{0, 0}, {2560, 1578}}</string> + <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string> + </object> + <object class="NSCustomObject" id="410970406"> + <string key="NSClassName">ChromeUILocalizer</string> + </object> + <object class="NSCustomObject" id="673727395"> + <string key="NSClassName">GTMUILocalizerAndLayoutTweaker</string> + </object> + </object> + <object class="IBObjectContainer" key="IBDocument.Objects"> + <object class="NSMutableArray" key="connectionRecords"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">cancelButton_</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="478302198"/> + </object> + <int key="connectionID">11</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">okButton_</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="806362510"/> + </object> + <int key="connectionID">12</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">titleField_</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="592145570"/> + </object> + <int key="connectionID">13</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">window</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="477128141"/> + </object> + <int key="connectionID">14</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">uiObject_</string> + <reference key="source" ref="673727395"/> + <reference key="destination" ref="477128141"/> + </object> + <int key="connectionID">17</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">localizer_</string> + <reference key="source" ref="673727395"/> + <reference key="destination" ref="410970406"/> + </object> + <int key="connectionID">18</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">iconView_</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="561354826"/> + </object> + <int key="connectionID">19</int> + </object> + </object> + <object class="IBMutableOrderedSet" key="objectRecords"> + <object class="NSArray" key="orderedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBObjectRecord"> + <int key="objectID">0</int> + <object class="NSArray" key="object" id="1002"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <reference key="children" ref="1000"/> + <nil key="parent"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-2</int> + <reference key="object" ref="1001"/> + <reference key="parent" ref="1002"/> + <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-1</int> + <reference key="object" ref="1003"/> + <reference key="parent" ref="1002"/> + <string key="objectName">First Responder</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-3</int> + <reference key="object" ref="1004"/> + <reference key="parent" ref="1002"/> + <string key="objectName">Application</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1</int> + <reference key="object" ref="477128141"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="955129256"/> + </object> + <reference key="parent" ref="1002"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">2</int> + <reference key="object" ref="955129256"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="592145570"/> + <reference ref="478302198"/> + <reference ref="806362510"/> + <reference ref="561354826"/> + </object> + <reference key="parent" ref="477128141"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">3</int> + <reference key="object" ref="561354826"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="785962619"/> + </object> + <reference key="parent" ref="955129256"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4</int> + <reference key="object" ref="785962619"/> + <reference key="parent" ref="561354826"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5</int> + <reference key="object" ref="592145570"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="530390105"/> + </object> + <reference key="parent" ref="955129256"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">6</int> + <reference key="object" ref="530390105"/> + <reference key="parent" ref="592145570"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">7</int> + <reference key="object" ref="806362510"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="18743634"/> + </object> + <reference key="parent" ref="955129256"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">8</int> + <reference key="object" ref="478302198"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="745070348"/> + </object> + <reference key="parent" ref="955129256"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">9</int> + <reference key="object" ref="745070348"/> + <reference key="parent" ref="478302198"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">10</int> + <reference key="object" ref="18743634"/> + <reference key="parent" ref="806362510"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">15</int> + <reference key="object" ref="410970406"/> + <reference key="parent" ref="1002"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">16</int> + <reference key="object" ref="673727395"/> + <reference key="parent" ref="1002"/> + </object> + </object> + </object> + <object class="NSMutableDictionary" key="flattenedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>-1.IBPluginDependency</string> + <string>-2.IBPluginDependency</string> + <string>-3.IBPluginDependency</string> + <string>1.IBEditorWindowLastContentRect</string> + <string>1.IBPluginDependency</string> + <string>1.IBWindowTemplateEditedContentRect</string> + <string>1.NSWindowTemplate.visibleAtLaunch</string> + <string>10.IBPluginDependency</string> + <string>15.IBPluginDependency</string> + <string>16.IBPluginDependency</string> + <string>2.IBPluginDependency</string> + <string>3.IBPluginDependency</string> + <string>4.IBPluginDependency</string> + <string>5.IBPluginDependency</string> + <string>6.IBPluginDependency</string> + <string>7.IBPluginDependency</string> + <string>8.IBPluginDependency</string> + <string>9.IBPluginDependency</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilderKit</string> + <string>com.apple.InterfaceBuilderKit</string> + <string>{{1053, 538}, {307, 151}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{1053, 538}, {307, 151}}</string> + <boolean value="NO"/> + <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>com.apple.InterfaceBuilder.CocoaPlugin</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>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + </object> + <object class="NSMutableDictionary" key="unlocalizedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <nil key="activeLocalization"/> + <object class="NSMutableDictionary" key="localizations"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <nil key="sourceID"/> + <int key="maxID">19</int> + </object> + <object class="IBClassDescriber" key="IBDocument.Classes"> + <object class="NSMutableArray" key="referencedPartialClassDescriptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBPartialClassDescription"> + <string key="className">ChromeUILocalizer</string> + <string key="superclassName">GTMUILocalizer</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">browser/cocoa/ui_localizer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">ExtensionInstallPromptController</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>cancel:</string> + <string>ok:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>id</string> + <string>id</string> + </object> + </object> + <object class="NSMutableDictionary" key="outlets"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>cancelButton_</string> + <string>iconView_</string> + <string>okButton_</string> + <string>subtitleField_</string> + <string>titleField_</string> + <string>warningsBox_</string> + <string>warningsField_</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSButton</string> + <string>NSImageView</string> + <string>NSButton</string> + <string>NSTextField</string> + <string>NSTextField</string> + <string>NSBox</string> + <string>NSTextField</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">browser/cocoa/extensions/extension_install_prompt_controller.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">GTMUILocalizer</string> + <string key="superclassName">NSObject</string> + <object class="NSMutableDictionary" key="outlets"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>otherObjectToLocalize_</string> + <string>owner_</string> + <string>yetAnotherObjectToLocalize_</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="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">../third_party/GTM/AppKit/GTMUILocalizer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">GTMUILocalizerAndLayoutTweaker</string> + <string key="superclassName">NSObject</string> + <object class="NSMutableDictionary" key="outlets"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>localizerOwner_</string> + <string>localizer_</string> + <string>uiObject_</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>id</string> + <string>GTMUILocalizer</string> + <string>id</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">../third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">browser/cocoa/status_bubble_mac.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <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/chrome_browser_window.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/themed_window.h</string> + </object> + </object> + </object> + </object> + <int key="IBDocument.localizationMode">0</int> + <string key="IBDocument.LastKnownRelativeProjectPath">../../chrome.xcodeproj</string> + <int key="IBDocument.defaultPropertyAccessControl">3</int> + </data> +</archive> diff --git a/chrome/browser/cocoa/extensions/extension_install_prompt_controller.h b/chrome/browser/cocoa/extensions/extension_install_prompt_controller.h new file mode 100644 index 0000000..1d63ea5 --- /dev/null +++ b/chrome/browser/cocoa/extensions/extension_install_prompt_controller.h @@ -0,0 +1,61 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_COCOA_EXTENSION_INSTALL_PROMPT_H_ +#define CHROME_BROWSER_COCOA_EXTENSION_INSTALL_PROMPT_H_ + +#include <string> +#include <vector> + +#import <Cocoa/Cocoa.h> + +#include "base/scoped_nsobject.h" +#include "chrome/browser/extensions/extension_install_ui.h" +#include "third_party/skia/include/core/SkBitmap.h" + +class Extension; +class Profile; + +// A controller for dialog to let the user install an extension. Created by +// CrxInstaller. +@interface ExtensionInstallPromptController : NSWindowController { +@private + IBOutlet NSImageView* iconView_; + IBOutlet NSTextField* titleField_; + IBOutlet NSTextField* subtitleField_; + IBOutlet NSTextField* warningsField_; + IBOutlet NSBox* warningsBox_; + IBOutlet NSButton* cancelButton_; + IBOutlet NSButton* okButton_; + + NSWindow* parentWindow_; // weak + Profile* profile_; // weak + ExtensionInstallUI::Delegate* delegate_; // weak + + scoped_nsobject<NSString> title_; + scoped_nsobject<NSString> warnings_; + SkBitmap icon_; +} + +@property (readonly) NSImageView* iconView; +@property (readonly) NSTextField* titleField; +@property (readonly) NSTextField* subtitleField; +@property (readonly) NSTextField* warningsField; +@property (readonly) NSBox* warningsBox; +@property (readonly) NSButton* cancelButton; +@property (readonly) NSButton* okButton; + +- (id)initWithParentWindow:(NSWindow*)window + profile:(Profile*)profile + extension:(Extension*)extension + delegate:(ExtensionInstallUI::Delegate*)delegate + icon:(SkBitmap*)bitmap + warnings:(const std::vector<string16>&)warnings; +- (void)runAsModalSheet; +- (IBAction)cancel:(id)sender; +- (IBAction)ok:(id)sender; + +@end + +#endif /* CHROME_BROWSER_COCOA_EXTENSION_INSTALL_PROMPT_H_ */ diff --git a/chrome/browser/cocoa/extensions/extension_install_prompt_controller.mm b/chrome/browser/cocoa/extensions/extension_install_prompt_controller.mm new file mode 100644 index 0000000..ec9dba4 --- /dev/null +++ b/chrome/browser/cocoa/extensions/extension_install_prompt_controller.mm @@ -0,0 +1,207 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "chrome/browser/cocoa/extensions/extension_install_prompt_controller.h" + +#include "app/l10n_util.h" +#include "app/l10n_util_mac.h" +#include "base/mac_util.h" +#include "base/string_util.h" +#include "base/sys_string_conversions.h" +#include "base/utf_string_conversions.h" +#include "chrome/browser/browser.h" +#include "chrome/browser/browser_list.h" +#include "chrome/browser/browser_window.h" +#include "chrome/common/extensions/extension.h" +#include "grit/generated_resources.h" +#include "skia/ext/skia_utils_mac.h" + +namespace { + +// Maximum height we will adjust controls to when trying to accomodate their +// contents. +const CGFloat kMaxControlHeight = 400; + +// Adjust a control's height so that its content its not clipped. Returns the +// amount the control's height had to be adjusted. +CGFloat AdjustControlHeightToFitContent(NSControl* control) { + NSRect currentRect = [control frame]; + NSRect fitRect = currentRect; + fitRect.size.height = kMaxControlHeight; + CGFloat desiredHeight = [[control cell] cellSizeForBounds:fitRect].height; + CGFloat offset = desiredHeight - currentRect.size.height; + + [control setFrameSize:NSMakeSize(currentRect.size.width, + currentRect.size.height + offset)]; + return offset; +} + +// Moves the control vertically by the specified amount. +void OffsetControlVertically(NSControl* control, CGFloat amount) { + NSPoint origin = [control frame].origin; + origin.y += amount; + [control setFrameOrigin:origin]; +} + +} + +@implementation ExtensionInstallPromptController + +@synthesize iconView = iconView_; +@synthesize titleField = titleField_; +@synthesize subtitleField = subtitleField_; +@synthesize warningsField = warningsField_; +@synthesize warningsBox= warningsBox_; +@synthesize cancelButton = cancelButton_; +@synthesize okButton = okButton_; + +- (id)initWithParentWindow:(NSWindow*)window + profile:(Profile*)profile + extension:(Extension*)extension + delegate:(ExtensionInstallUI::Delegate*)delegate + icon:(SkBitmap*)icon + warnings:(const std::vector<string16>&)warnings { + NSString* nibpath = nil; + + // We use a different XIB in the case of no warnings, that is a little bit + // more nicely laid out. + if (warnings.empty()) { + nibpath = [mac_util::MainAppBundle() + pathForResource:@"ExtensionInstallPromptNoWarnings" + ofType:@"nib"]; + } else { + nibpath = [mac_util::MainAppBundle() + pathForResource:@"ExtensionInstallPrompt" + ofType:@"nib"]; + } + + if ((self = [super initWithWindowNibPath:nibpath owner:self])) { + parentWindow_ = window; + profile_ = profile; + icon_ = *icon; + delegate_ = delegate; + + title_.reset( + [l10n_util::GetNSStringF(IDS_EXTENSION_INSTALL_PROMPT_HEADING, + UTF8ToUTF16(extension->name())) retain]); + + // We display the warnings as a simple text string, separated by newlines. + if (!warnings.empty()) { + string16 joined_warnings; + for (size_t i = 0; i < warnings.size(); ++i) { + if (i > 0) + joined_warnings += UTF8ToUTF16("\n\n"); + + joined_warnings += warnings[i]; + } + + warnings_.reset( + [base::SysUTF16ToNSString(joined_warnings) retain]); + } + } + return self; +} + +- (void)runAsModalSheet { + [NSApp beginSheet:[self window] + modalForWindow:parentWindow_ + modalDelegate:self + didEndSelector:@selector(didEndSheet:returnCode:contextInfo:) + contextInfo:nil]; +} + +- (IBAction)cancel:(id)sender { + delegate_->InstallUIAbort(); + [NSApp endSheet:[self window]]; +} + +- (IBAction)ok:(id)sender { + delegate_->InstallUIProceed(false); // Don't create shortcut. + [NSApp endSheet:[self window]]; +} + +- (void)awakeFromNib { + [titleField_ setStringValue:title_.get()]; + + NSImage* image = gfx::SkBitmapToNSImage(icon_); + [iconView_ setImage:image]; + + // If there are any warnings, then we have to do some special layout. + if ([warnings_.get() length] > 0) { + [warningsField_ setStringValue:warnings_.get()]; + + // The dialog is laid out in the NIB exactly how we want it assuming that + // each label fits on one line. However, for each label, we want to allow + // wrapping onto multiple lines. So we accumulate an offset by measuring how + // big each label wants to be, and comparing it to how bit it actually is. + // Then we shift each label down and resize by the appropriate amount, then + // finally resize the window. + CGFloat totalOffset = 0.0; + + // Text fields. + totalOffset += AdjustControlHeightToFitContent(titleField_); + OffsetControlVertically(titleField_, -totalOffset); + + totalOffset += AdjustControlHeightToFitContent(subtitleField_); + OffsetControlVertically(subtitleField_, -totalOffset); + + CGFloat warningsOffset = AdjustControlHeightToFitContent(warningsField_); + OffsetControlVertically(warningsField_, -warningsOffset); + totalOffset += warningsOffset; + + NSRect warningsBoxRect = [warningsBox_ frame]; + warningsBoxRect.origin.y -= totalOffset; + warningsBoxRect.size.height += warningsOffset; + [warningsBox_ setFrame:warningsBoxRect]; + + // buttons are positioned automatically in the XIB. + + // Finally, adjust the window size. + NSRect currentRect = [[self window] frame]; + [[self window] setFrame:NSMakeRect(currentRect.origin.x, + currentRect.origin.y - totalOffset, + currentRect.size.width, + currentRect.size.height + totalOffset) + display:NO]; + } +} + +- (void)didEndSheet:(NSWindow*)sheet + returnCode:(int)returnCode + contextInfo:(void*)contextInfo { + [[self window] orderOut:self]; + [self autorelease]; +} + +@end // ExtensionInstallPromptController + + +void ExtensionInstallUI::ShowExtensionInstallUIPrompt2Impl( + Profile* profile, Delegate* delegate, Extension* extension, SkBitmap* icon, + const std::vector<string16>& warnings) { + Browser* browser = BrowserList::GetLastActiveWithProfile(profile); + if (!browser) { + delegate->InstallUIAbort(); + return; + } + + BrowserWindow* window = browser->window(); + if (!window) { + delegate->InstallUIAbort(); + return; + } + + gfx::NativeWindow native_window = window->GetNativeHandle(); + + ExtensionInstallPromptController* controller = + [[ExtensionInstallPromptController alloc] + initWithParentWindow:native_window + profile:profile + extension:extension + delegate:delegate + icon:icon + warnings:warnings]; + + [controller runAsModalSheet]; +} diff --git a/chrome/browser/cocoa/extensions/extension_install_prompt_controller_unittest.mm b/chrome/browser/cocoa/extensions/extension_install_prompt_controller_unittest.mm new file mode 100644 index 0000000..f1a02d9 --- /dev/null +++ b/chrome/browser/cocoa/extensions/extension_install_prompt_controller_unittest.mm @@ -0,0 +1,296 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import <Cocoa/Cocoa.h> + +#include "base/file_path.h" +#include "base/file_util.h" +#include "base/path_service.h" +#include "base/sys_string_conversions.h" +#include "base/utf_string_conversions.h" +#include "base/values.h" +#import "chrome/browser/cocoa/extensions/extension_install_prompt_controller.h" +#include "chrome/browser/cocoa/browser_test_helper.h" +#import "chrome/browser/cocoa/cocoa_test_helper.h" +#import "chrome/browser/extensions/extension_install_ui.h" +#include "chrome/common/chrome_paths.h" +#include "chrome/common/extensions/extension.h" +#include "chrome/common/json_value_serializer.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "webkit/glue/image_decoder.h" + + +// Base class for our tests. +class ExtensionInstallPromptControllerTest : public CocoaTest { +public: + ExtensionInstallPromptControllerTest() { + PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_); + test_data_dir_ = test_data_dir_.AppendASCII("extensions") + .AppendASCII("install_prompt"); + + LoadIcon(); + LoadExtension(); + } + + protected: + void LoadIcon() { + std::string file_contents; + file_util::ReadFileToString(test_data_dir_.AppendASCII("icon.png"), + &file_contents); + + webkit_glue::ImageDecoder decoder; + icon_ = decoder.Decode( + reinterpret_cast<const unsigned char*>(file_contents.c_str()), + file_contents.length()); + } + + void LoadExtension() { + FilePath path = test_data_dir_.AppendASCII("extension.json"); + + std::string error; + JSONFileValueSerializer serializer(path); + scoped_ptr<DictionaryValue> value(static_cast<DictionaryValue*>( + serializer.Deserialize(&error))); + if (!value.get()) { + LOG(ERROR) << error; + return; + } + + scoped_ptr<Extension> extension(new Extension(path.DirName())); + if (!extension->InitFromValue(*value, false, &error)) { + LOG(ERROR) << error; + return; + } + + extension_.reset(extension.release()); + } + + BrowserTestHelper helper_; + FilePath test_data_dir_; + SkBitmap icon_; + scoped_ptr<Extension> extension_; +}; + + +// Mock out the ExtensionInstallUI::Delegate interface so we can ensure the +// dialog is interacting with it correctly. +class MockExtensionInstallUIDelegate : public ExtensionInstallUI::Delegate { + public: + MockExtensionInstallUIDelegate() + : proceed_count_(0), + abort_count_(0), + last_proceed_was_create_app_shortcut_(0) {} + + // ExtensionInstallUI::Delegate overrides. + virtual void InstallUIProceed(bool create_app_shortcut) { + proceed_count_++; + last_proceed_was_create_app_shortcut_ = create_app_shortcut; + } + + virtual void InstallUIAbort() { + abort_count_++; + } + + int proceed_count() { return proceed_count_; } + int abort_count() { return abort_count_; } + bool last_proceed_was_create_app_shortcut() { + return last_proceed_was_create_app_shortcut_; + } + + protected: + int proceed_count_; + int abort_count_; + bool last_proceed_was_create_app_shortcut_; +}; + + +// Test that we can load the two kinds of prompts correctly, that the outlets +// are hooked up, and that the dialog calls cancel when cancel is pressed. +TEST_F(ExtensionInstallPromptControllerTest, BasicsNormalCancel) { + scoped_ptr<MockExtensionInstallUIDelegate> delegate( + new MockExtensionInstallUIDelegate); + + std::vector<string16> warnings; + warnings.push_back(UTF8ToUTF16("warning 1")); + + scoped_nsobject<ExtensionInstallPromptController> + controller([[ExtensionInstallPromptController alloc] + initWithParentWindow:test_window() + profile:helper_.profile() + extension:extension_.get() + delegate:delegate.get() + icon:&icon_ + warnings:warnings]); + + [controller window]; // force nib load + + // Test the right nib loaded. + EXPECT_TRUE([[controller windowNibName] isEqual:@"ExtensionInstallPrompt"]); + + // Check all the controls. + // Make sure everything is non-nil, and that the fields that are + // auto-translated don't start with a caret (that would indicate that they + // were not translated). + EXPECT_TRUE([controller iconView] != nil); + EXPECT_TRUE([[controller iconView] image] != nil); + + EXPECT_TRUE([controller titleField] != nil); + EXPECT_NE(0u, [[[controller titleField] stringValue] length]); + + EXPECT_TRUE([controller subtitleField] != nil); + EXPECT_NE(0u, [[[controller subtitleField] stringValue] length]); + EXPECT_NE('^', [[[controller subtitleField] stringValue] characterAtIndex:0]); + + EXPECT_TRUE([controller warningsField] != nil); + EXPECT_TRUE([[[controller warningsField] stringValue] + isEqual:(base::SysUTF16ToNSString(warnings[0]))]); + + EXPECT_TRUE([controller warningsBox] != nil); + + EXPECT_TRUE([controller cancelButton] != nil); + EXPECT_NE(0u, [[[controller cancelButton] stringValue] length]); + EXPECT_NE('^', [[[controller cancelButton] stringValue] characterAtIndex:0]); + + EXPECT_TRUE([controller okButton] != nil); + EXPECT_NE(0u, [[[controller okButton] stringValue] length]); + EXPECT_NE('^', [[[controller okButton] stringValue] characterAtIndex:0]); + + // Test that cancel calls our delegate. + [controller cancel:nil]; + EXPECT_EQ(1, delegate->abort_count()); + EXPECT_EQ(0, delegate->proceed_count()); + EXPECT_FALSE(delegate->last_proceed_was_create_app_shortcut()); +} + + +TEST_F(ExtensionInstallPromptControllerTest, BasicsNormalOK) { + scoped_ptr<MockExtensionInstallUIDelegate> delegate( + new MockExtensionInstallUIDelegate); + + std::vector<string16> warnings; + warnings.push_back(UTF8ToUTF16("warning 1")); + + scoped_nsobject<ExtensionInstallPromptController> + controller([[ExtensionInstallPromptController alloc] + initWithParentWindow:test_window() + profile:helper_.profile() + extension:extension_.get() + delegate:delegate.get() + icon:&icon_ + warnings:warnings]); + + [controller window]; // force nib load + [controller ok:nil]; + + EXPECT_EQ(0, delegate->abort_count()); + EXPECT_EQ(1, delegate->proceed_count()); + EXPECT_FALSE(delegate->last_proceed_was_create_app_shortcut()); +} + +// Test that controls get repositioned when there are two warnings vs one +// warning. +TEST_F(ExtensionInstallPromptControllerTest, MultipleWarnings) { + scoped_ptr<MockExtensionInstallUIDelegate> delegate1( + new MockExtensionInstallUIDelegate); + scoped_ptr<MockExtensionInstallUIDelegate> delegate2( + new MockExtensionInstallUIDelegate); + + std::vector<string16> one_warning; + one_warning.push_back(UTF8ToUTF16("warning 1")); + + std::vector<string16> two_warnings; + two_warnings.push_back(UTF8ToUTF16("warning 1")); + two_warnings.push_back(UTF8ToUTF16("warning 2")); + + scoped_nsobject<ExtensionInstallPromptController> + controller1([[ExtensionInstallPromptController alloc] + initWithParentWindow:test_window() + profile:helper_.profile() + extension:extension_.get() + delegate:delegate1.get() + icon:&icon_ + warnings:one_warning]); + + [controller1 window]; // force nib load + + scoped_nsobject<ExtensionInstallPromptController> + controller2([[ExtensionInstallPromptController alloc] + initWithParentWindow:test_window() + profile:helper_.profile() + extension:extension_.get() + delegate:delegate2.get() + icon:&icon_ + warnings:two_warnings]); + + [controller2 window]; // force nib load + + // Test control positioning. We don't test exact positioning because we don't + // want this to depend on string details and localization. But we do know the + // relative effect that adding a second warning should have on the layout. + ASSERT_LT([[controller1 window] frame].size.height, + [[controller2 window] frame].size.height); + + ASSERT_LT([[controller1 warningsField] frame].size.height, + [[controller2 warningsField] frame].size.height); + + ASSERT_LT([[controller1 warningsBox] frame].size.height, + [[controller2 warningsBox] frame].size.height); + + ASSERT_EQ([[controller1 warningsBox] frame].origin.y, + [[controller2 warningsBox] frame].origin.y); + + ASSERT_LT([[controller1 subtitleField] frame].origin.y, + [[controller2 subtitleField] frame].origin.y); + + ASSERT_LT([[controller1 titleField] frame].origin.y, + [[controller2 titleField] frame].origin.y); +} + +// Test that we can load the skinny prompt correctly, and that the outlets are +// are hooked up. +TEST_F(ExtensionInstallPromptControllerTest, BasicsSkinny) { + scoped_ptr<MockExtensionInstallUIDelegate> delegate( + new MockExtensionInstallUIDelegate); + + // No warnings should trigger skinny prompt. + std::vector<string16> warnings; + + scoped_nsobject<ExtensionInstallPromptController> + controller([[ExtensionInstallPromptController alloc] + initWithParentWindow:test_window() + profile:helper_.profile() + extension:extension_.get() + delegate:delegate.get() + icon:&icon_ + warnings:warnings]); + + [controller window]; // force nib load + + // Test the right nib loaded. + EXPECT_TRUE([[controller windowNibName] + isEqual:@"ExtensionInstallPromptNoWarnings"]); + + // Check all the controls. + // In the skinny prompt, only the icon, title and buttons are non-nill. + // Everything else is nil. + EXPECT_TRUE([controller iconView] != nil); + EXPECT_TRUE([[controller iconView] image] != nil); + + EXPECT_TRUE([controller titleField] != nil); + EXPECT_NE(0u, [[[controller titleField] stringValue] length]); + + EXPECT_TRUE([controller cancelButton] != nil); + EXPECT_NE(0u, [[[controller cancelButton] stringValue] length]); + EXPECT_NE('^', [[[controller cancelButton] stringValue] characterAtIndex:0]); + + EXPECT_TRUE([controller okButton] != nil); + EXPECT_NE(0u, [[[controller okButton] stringValue] length]); + EXPECT_NE('^', [[[controller okButton] stringValue] characterAtIndex:0]); + + EXPECT_TRUE([controller subtitleField] == nil); + EXPECT_TRUE([controller warningsField] == nil); + EXPECT_TRUE([controller warningsBox] == nil); +} diff --git a/chrome/browser/extensions/extension_install_ui.cc b/chrome/browser/extensions/extension_install_ui.cc index a40ae58..76eacdd 100644 --- a/chrome/browser/extensions/extension_install_ui.cc +++ b/chrome/browser/extensions/extension_install_ui.cc @@ -82,56 +82,6 @@ static bool ExtensionHasFileAccess(Extension* extension) { return false; } -// TODO(estade): remove this function when the old install UI is removed. It -// is commented out on linux/gtk due to compiler warnings. -#if !defined(TOOLKIT_GTK) -static std::wstring GetInstallWarning(Extension* extension) { - // If the extension has a plugin, it's easy: the plugin has the most severe - // warning. - if (!extension->plugins().empty() || ExtensionHasFileAccess(extension)) - return l10n_util::GetString(IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS); - - // Otherwise, we go in descending order of severity: all hosts, several hosts, - // a single host, no hosts. For each of these, we also have a variation of the - // message for when api permissions are also requested. - if (extension->HasAccessToAllHosts()) { - if (!extension->HasEffectiveBrowsingHistoryPermission()) - return l10n_util::GetString(IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS); - else - return l10n_util::GetString( - IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS_AND_BROWSER); - } - - const std::set<std::string> hosts = extension->GetEffectiveHostPermissions(); - if (hosts.size() > 1) { - if (!extension->HasEffectiveBrowsingHistoryPermission()) - return l10n_util::GetString( - IDS_EXTENSION_PROMPT_WARNING_MULTIPLE_HOSTS); - else - return l10n_util::GetString( - IDS_EXTENSION_PROMPT_WARNING_MULTIPLE_HOSTS_AND_BROWSER); - } - - if (hosts.size() == 1) { - if (!extension->HasEffectiveBrowsingHistoryPermission()) - return l10n_util::GetStringF( - IDS_EXTENSION_PROMPT_WARNING_SINGLE_HOST, - UTF8ToWide(*hosts.begin())); - else - return l10n_util::GetStringF( - IDS_EXTENSION_PROMPT_WARNING_SINGLE_HOST_AND_BROWSER, - UTF8ToWide(*hosts.begin())); - } - - DCHECK(hosts.size() == 0); - if (!extension->HasEffectiveBrowsingHistoryPermission()) - return L""; - else - return l10n_util::GetString(IDS_EXTENSION_PROMPT_WARNING_BROWSER); -} -#endif - -#if defined(OS_WIN) || defined(TOOLKIT_GTK) static void GetV2Warnings(Extension* extension, std::vector<string16>* warnings) { if (!extension->plugins().empty() || ExtensionHasFileAccess(extension)) { @@ -180,7 +130,6 @@ static void GetV2Warnings(Extension* extension, // TODO(aa): Geolocation, camera/mic, what else? } -#endif } // namespace @@ -314,16 +263,10 @@ void ExtensionInstallUI::OnImageLoaded( Source<ExtensionInstallUI>(this), NotificationService::NoDetails()); -#if defined(OS_WIN) || defined(TOOLKIT_GTK) std::vector<string16> warnings; GetV2Warnings(extension_, &warnings); ShowExtensionInstallUIPrompt2Impl( profile_, delegate_, extension_, &icon_, warnings); -#else - ShowExtensionInstallUIPromptImpl( - profile_, delegate_, extension_, &icon_, - WideToUTF16Hack(GetInstallWarning(extension_)), INSTALL_PROMPT); -#endif break; } case UNINSTALL_PROMPT: { diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index a308197..6e5b03e 100755 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -630,6 +630,8 @@ 'browser/cocoa/extensions/browser_actions_controller.mm', 'browser/cocoa/extensions/extension_action_context_menu.h', 'browser/cocoa/extensions/extension_action_context_menu.mm', + 'browser/cocoa/extensions/extension_install_prompt_controller.h', + 'browser/cocoa/extensions/extension_install_prompt_controller.mm', 'browser/cocoa/extensions/extension_popup_controller.h', 'browser/cocoa/extensions/extension_popup_controller.mm', 'browser/cocoa/external_protocol_dialog.h', @@ -2626,6 +2628,8 @@ 'app/nibs/DownloadShelf.xib', 'app/nibs/EditSearchEngine.xib', 'app/nibs/ExtensionInstalledBubble.xib', + 'app/nibs/ExtensionInstallPrompt.xib', + 'app/nibs/ExtensionInstallPromptNoWarnings.xib', 'app/nibs/FirstRunDialog.xib', 'app/nibs/FontLanguageSettings.xib', 'app/nibs/HttpAuthLoginSheet.xib', diff --git a/chrome/chrome_dll.gypi b/chrome/chrome_dll.gypi index d6dd68a..9b5d695 100644 --- a/chrome/chrome_dll.gypi +++ b/chrome/chrome_dll.gypi @@ -209,6 +209,8 @@ 'app/nibs/DownloadShelf.xib', 'app/nibs/EditSearchEngine.xib', 'app/nibs/ExtensionInstalledBubble.xib', + 'app/nibs/ExtensionInstallPrompt.xib', + 'app/nibs/ExtensionInstallPromptNoWarnings.xib', 'app/nibs/FindBar.xib', 'app/nibs/FirstRunDialog.xib', 'app/nibs/FontLanguageSettings.xib', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 6b7228e..954182f 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -660,6 +660,7 @@ 'browser/cocoa/edit_search_engine_cocoa_controller_unittest.mm', 'browser/cocoa/extension_installed_bubble_controller_unittest.mm', 'browser/cocoa/extensions/browser_actions_container_view_unittest.mm', + 'browser/cocoa/extensions/extension_install_prompt_controller_unittest.mm', 'browser/cocoa/extensions/extension_popup_controller_unittest.mm', 'browser/cocoa/event_utils_unittest.mm', 'browser/cocoa/fast_resize_view_unittest.mm', diff --git a/chrome/test/data/extensions/install_prompt/extension.json b/chrome/test/data/extensions/install_prompt/extension.json new file mode 100644 index 0000000..0d9792a --- /dev/null +++ b/chrome/test/data/extensions/install_prompt/extension.json @@ -0,0 +1,4 @@ +{ + "name": "test", + "version": "1" +} diff --git a/chrome/test/data/extensions/install_prompt/icon.png b/chrome/test/data/extensions/install_prompt/icon.png Binary files differnew file mode 100644 index 0000000..d145964 --- /dev/null +++ b/chrome/test/data/extensions/install_prompt/icon.png |