summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/app/nibs/ExtensionInstallPrompt.xib745
-rw-r--r--chrome/app/nibs/ExtensionInstallPromptNoWarnings.xib575
-rw-r--r--chrome/browser/cocoa/extensions/extension_install_prompt_controller.h61
-rw-r--r--chrome/browser/cocoa/extensions/extension_install_prompt_controller.mm207
-rw-r--r--chrome/browser/cocoa/extensions/extension_install_prompt_controller_unittest.mm296
-rw-r--r--chrome/browser/extensions/extension_install_ui.cc57
-rwxr-xr-xchrome/chrome_browser.gypi4
-rw-r--r--chrome/chrome_dll.gypi2
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/test/data/extensions/install_prompt/extension.json4
-rw-r--r--chrome/test/data/extensions/install_prompt/icon.pngbin0 -> 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
new file mode 100644
index 0000000..d145964
--- /dev/null
+++ b/chrome/test/data/extensions/install_prompt/icon.png
Binary files differ