diff options
Diffstat (limited to 'chrome')
31 files changed, 1193 insertions, 155 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index fbb44ce..c790942 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -2376,12 +2376,18 @@ each locale. --> <message name="IDS_BLOCKED_JAVASCRIPT_LINK" desc="Link to JavaScript section of content blocking management dialog, displayed in bubble when a page tries to run JavaScript."> Manage JavaScript blocking... </message> - <message name="IDS_BLOCKED_PLUGINS_TITLE" desc="Tooltip and bubble info header text when a page is not allowed to display plug-ins."> + <message name="IDS_BLOCKED_PLUGINS_TITLE" desc="Bubble info header text when a page is not allowed to display plug-ins."> + The following plug-ins were blocked on this page: + </message> + <message name="IDS_BLOCKED_PLUGINS_MESSAGE" desc="Tooltip and message when a page is not allowed to display plug-ins."> Plug-ins were blocked on this page. </message> - <message name="IDS_BLOCKED_PLUGINS_UNBLOCK" desc="Radio button choice to unblock a site from using plug-ins, displayed in bubble when a page tries to use plug-ins."> + <message name="IDS_BLOCKED_PLUGINS_UNBLOCK_ALL" desc="Radio button choice to unblock a site from using plug-ins, displayed in bubble when a page tries to use plug-ins."> Always allow plug-ins on <ph name="HOST">$1<ex>mail.google.com</ex></ph> </message> + <message name="IDS_BLOCKED_PLUGINS_UNBLOCK" desc="Radio button choice to unblock a site from using *a specific set* of plug-ins, displayed in bubble when a page tries to use plug-ins."> + Always allow these plug-ins on <ph name="HOST">$1<ex>mail.google.com</ex></ph> + </message> <message name="IDS_BLOCKED_PLUGINS_NO_ACTION" desc="Radio button choice to continue blocking a site from using plug-ins, displayed in bubble when a page tries to use plug-ins."> Continue blocking plug-ins </message> @@ -2391,6 +2397,9 @@ each locale. --> <message name="IDS_BLOCKED_PLUGINS_LOAD_ALL" desc="Button to load all blocked plugins on a page, displayed in bubble when a page tries to display plug-ins."> Run all plug-ins this time </message> + <message name="IDS_BLOCKED_PLUGINS_UNBLOCK_SHORT" desc="Button to unblock nonsandboxed plug-ins on a site"> + Always allow + </message> <!-- SSL error strings --> <message name="IDS_SEVERAL_SSL_ERRORS" desc="Bubble info header text when there is more than 1 error"> diff --git a/chrome/app/nibs/ContentBlockedPlugins.xib b/chrome/app/nibs/ContentBlockedPlugins.xib index 574dc74..0fa7627 100644 --- a/chrome/app/nibs/ContentBlockedPlugins.xib +++ b/chrome/app/nibs/ContentBlockedPlugins.xib @@ -1,14 +1,18 @@ <?xml version="1.0" encoding="UTF-8"?> -<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03"> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10"> <data> <int key="IBDocument.SystemTarget">1050</int> - <string key="IBDocument.SystemVersion">9L31a</string> - <string key="IBDocument.InterfaceBuilderVersion">680</string> - <string key="IBDocument.AppKitVersion">949.54</string> - <string key="IBDocument.HIToolboxVersion">353.00</string> + <string key="IBDocument.SystemVersion">10F569</string> + <string key="IBDocument.InterfaceBuilderVersion">762</string> + <string key="IBDocument.AppKitVersion">1038.29</string> + <string key="IBDocument.HIToolboxVersion">461.00</string> + <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="NS.object.0">762</string> + </object> <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="35"/> + <integer value="4"/> </object> <object class="NSArray" key="IBDocument.PluginDependencies"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -16,7 +20,7 @@ </object> <object class="NSMutableDictionary" key="IBDocument.Metadata"> <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> + <object class="NSArray" key="dict.sortedKeys" id="0"> <bool key="EncodedWithXMLCoder">YES</bool> </object> <object class="NSMutableArray" key="dict.values"> @@ -37,12 +41,12 @@ <object class="NSWindowTemplate" id="1005"> <int key="NSWindowStyleMask">15</int> <int key="NSWindowBacking">2</int> - <string key="NSWindowRect">{{196, 353}, {314, 157}}</string> + <string key="NSWindowRect">{{196, 353}, {314, 179}}</string> <int key="NSWTFlags">536873984</int> <string key="NSWindowTitle">Window</string> <string key="NSWindowClass">InfoBubbleWindow</string> <nil key="NSViewClass"/> - <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string> + <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string> <object class="NSView" key="NSWindowView" id="1006"> <reference key="NSNextResponder"/> <int key="NSvFlags">256</int> @@ -53,6 +57,42 @@ <int key="NSvFlags">274</int> <object class="NSMutableArray" key="NSSubviews"> <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTextField" id="169749286"> + <reference key="NSNextResponder" ref="301729179"/> + <int key="NSvFlags">266</int> + <string key="NSFrame">{{17, 123}, {269, 14}}</string> + <reference key="NSSuperview" ref="301729179"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="264536333"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">272760832</int> + <string key="NSContents"><Do not localize></string> + <object class="NSFont" key="NSSupport" id="26"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">11</double> + <int key="NSfFlags">3100</int> + </object> + <reference key="NSControlView" ref="169749286"/> + <object class="NSColor" key="NSBackgroundColor" id="657398381"> + <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">MC42NjY2NjY2NjY3AA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor" id="96266275"> + <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="NSCustomView" id="242530517"> <reference key="NSNextResponder" ref="301729179"/> <int key="NSvFlags">292</int> @@ -68,11 +108,7 @@ <int key="NSCellFlags">-2080244224</int> <int key="NSCellFlags2">134348800</int> <string key="NSContents">^IDS_BLOCKED_PLUGINS_LOAD_ALL</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="NSSupport" ref="26"/> <reference key="NSControlView" ref="641116266"/> <int key="NSButtonFlags">-2038152961</int> <int key="NSButtonFlags2">164</int> @@ -90,7 +126,7 @@ <object class="NSTextField" id="266815090"> <reference key="NSNextResponder" ref="301729179"/> <int key="NSvFlags">266</int> - <string key="NSFrame">{{17, 123}, {280, 14}}</string> + <string key="NSFrame">{{17, 145}, {280, 14}}</string> <reference key="NSSuperview" ref="301729179"/> <bool key="NSEnabled">YES</bool> <object class="NSTextFieldCell" key="NSCell" id="157361777"> @@ -99,24 +135,8 @@ <string key="NSContents">^IDS_BLOCKED_PLUGINS_TITLE</string> <reference key="NSSupport" ref="26"/> <reference key="NSControlView" ref="266815090"/> - <object class="NSColor" key="NSBackgroundColor" id="657398381"> - <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> + <reference key="NSBackgroundColor" ref="657398381"/> + <reference key="NSTextColor" ref="96266275"/> </object> </object> <object class="NSMatrix" id="126329017"> @@ -134,8 +154,8 @@ <int key="NSCellFlags2">131072</int> <string key="NSContents">^IDS_BLOCKED_PLUGINS_UNBLOCK</string> <reference key="NSSupport" ref="26"/> - <int key="NSTag">1</int> <reference key="NSControlView" ref="126329017"/> + <int key="NSTag">1</int> <int key="NSButtonFlags">1211912703</int> <int key="NSButtonFlags2">0</int> <object class="NSButtonImageSource" key="NSAlternateImage" id="564397696"> @@ -151,8 +171,8 @@ <int key="NSCellFlags2">131072</int> <string key="NSContents">^IDS_BLOCKED_PLUGINS_NO_ACTION</string> <reference key="NSSupport" ref="26"/> - <int key="NSTag">2</int> <reference key="NSControlView" ref="126329017"/> + <int key="NSTag">2</int> <int key="NSButtonFlags">1211912703</int> <int key="NSButtonFlags2">0</int> <object class="NSImage" key="NSNormalImage"> @@ -162,7 +182,7 @@ <bool key="EncodedWithXMLCoder">YES</bool> <object class="NSArray"> <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0" id="8"/> + <integer value="0"/> <object class="NSBitmapImageRep"> <object class="NSData" key="NSTIFFRepresentation"> <bytes key="NS.bytes">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA @@ -188,7 +208,7 @@ AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES -AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABBxwAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA @@ -274,7 +294,7 @@ QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA</bytes> <bool key="EncodedWithXMLCoder">YES</bool> <object class="NSArray"> <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="8"/> + <integer value="0"/> <object class="NSBitmapImageRep"> <object class="NSData" key="NSTIFFRepresentation"> <bytes key="NS.bytes">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA @@ -300,7 +320,7 @@ AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES -AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABBxwAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> </object> </object> @@ -321,7 +341,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> </object> <object class="NSFont" key="NSFont" id="419827241"> <string key="NSName">LucidaGrande</string> - <double key="NSSize">1.300000e+01</double> + <double key="NSSize">13</double> <int key="NSfFlags">1044</int> </object> </object> @@ -413,16 +433,16 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <string key="NSClassName">GTMWidthBasedTweaker</string> </object> </object> - <string key="NSFrameSize">{314, 157}</string> + <string key="NSFrameSize">{314, 179}</string> <reference key="NSSuperview" ref="1006"/> <string key="NSClassName">InfoBubbleView</string> </object> </object> - <string key="NSFrameSize">{314, 157}</string> + <string key="NSFrameSize">{314, 179}</string> <reference key="NSSuperview"/> </object> <string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string> - <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string> + <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string> </object> <object class="NSCustomObject" id="670916757"> <string key="NSClassName">ChromeUILocalizer</string> @@ -546,34 +566,40 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> </object> <int key="connectionID">37</int> </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">blockedResourcesField_</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="169749286"/> + </object> + <int key="connectionID">40</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="134356264"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> + <reference key="object" ref="0"/> <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="134356264"/> - <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string> + <reference key="parent" ref="0"/> + <string key="objectName">File's Owner</string> </object> <object class="IBObjectRecord"> <int key="objectID">-1</int> <reference key="object" ref="1003"/> - <reference key="parent" ref="134356264"/> + <reference key="parent" ref="0"/> <string key="objectName">First Responder</string> </object> <object class="IBObjectRecord"> <int key="objectID">-3</int> <reference key="object" ref="1004"/> - <reference key="parent" ref="134356264"/> + <reference key="parent" ref="0"/> <string key="objectName">Application</string> </object> <object class="IBObjectRecord"> @@ -583,7 +609,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <bool key="EncodedWithXMLCoder">YES</bool> <reference ref="1006"/> </object> - <reference key="parent" ref="134356264"/> + <reference key="parent" ref="0"/> </object> <object class="IBObjectRecord"> <int key="objectID">2</int> @@ -605,6 +631,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <reference ref="730386640"/> <reference ref="395762087"/> <reference ref="242530517"/> + <reference ref="169749286"/> </object> <reference key="parent" ref="1006"/> </object> @@ -656,12 +683,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <object class="IBObjectRecord"> <int key="objectID">20</int> <reference key="object" ref="670916757"/> - <reference key="parent" ref="134356264"/> + <reference key="parent" ref="0"/> </object> <object class="IBObjectRecord"> <int key="objectID">21</int> <reference key="object" ref="684547419"/> - <reference key="parent" ref="134356264"/> + <reference key="parent" ref="0"/> </object> <object class="IBObjectRecord"> <int key="objectID">28</int> @@ -732,11 +759,25 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <reference key="object" ref="640364338"/> <reference key="parent" ref="641116266"/> </object> + <object class="IBObjectRecord"> + <int key="objectID">38</int> + <reference key="object" ref="169749286"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="264536333"/> + </object> + <reference key="parent" ref="301729179"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">39</int> + <reference key="object" ref="264536333"/> + <reference key="parent" ref="169749286"/> + </object> </object> </object> <object class="NSMutableDictionary" key="flattenedProperties"> <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMutableArray" key="dict.sortedKeys"> + <object class="NSArray" key="dict.sortedKeys"> <bool key="EncodedWithXMLCoder">YES</bool> <string>-1.IBPluginDependency</string> <string>-2.IBPluginDependency</string> @@ -760,6 +801,8 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <string>21.IBPluginDependency</string> <string>33.IBPluginDependency</string> <string>34.IBPluginDependency</string> + <string>38.IBPluginDependency</string> + <string>39.IBPluginDependency</string> <string>4.IBPluginDependency</string> <string>7.IBPluginDependency</string> <string>8.IBPluginDependency</string> @@ -770,9 +813,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{32, 644}, {314, 157}}</string> + <string>{{641, 625}, {314, 179}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{32, 644}, {314, 157}}</string> + <string>{{641, 625}, {314, 179}}</string> <boolean value="NO"/> <string>{196, 240}</string> <string>{{357, 418}, {480, 270}}</string> @@ -793,13 +836,13 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <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> + <reference key="dict.sortedKeys" ref="0"/> <object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> </object> @@ -807,15 +850,13 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <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> + <reference key="dict.sortedKeys" ref="0"/> <object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> </object> </object> <nil key="sourceID"/> - <int key="maxID">37</int> + <int key="maxID">40</int> </object> <object class="IBClassDescriber" key="IBDocument.Classes"> <object class="NSMutableArray" key="referencedPartialClassDescriptions"> @@ -853,7 +894,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <string key="superclassName">BaseBubbleController</string> <object class="NSMutableDictionary" key="actions"> <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMutableArray" key="dict.sortedKeys"> + <object class="NSArray" key="dict.sortedKeys"> <bool key="EncodedWithXMLCoder">YES</bool> <string>allowBlockToggled:</string> <string>closeBubble:</string> @@ -872,11 +913,13 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> </object> <object class="NSMutableDictionary" key="outlets"> <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMutableArray" key="dict.sortedKeys"> + <object class="NSArray" key="dict.sortedKeys"> <bool key="EncodedWithXMLCoder">YES</bool> <string>allowBlockRadioGroup_</string> + <string>blockedResourcesField_</string> <string>contentsContainer_</string> <string>doneButton_</string> + <string>infoButton_</string> <string>loadAllPluginsButton_</string> <string>manageButton_</string> <string>titleLabel_</string> @@ -884,10 +927,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> <string>NSMatrix</string> + <string>NSTextField</string> <string>NSView</string> <string>NSButton</string> <string>NSButton</string> <string>NSButton</string> + <string>NSButton</string> <string>NSTextField</string> </object> </object> @@ -901,7 +946,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <string key="superclassName">NSObject</string> <object class="NSMutableDictionary" key="outlets"> <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMutableArray" key="dict.sortedKeys"> + <object class="NSArray" key="dict.sortedKeys"> <bool key="EncodedWithXMLCoder">YES</bool> <string>otherObjectToLocalize_</string> <string>owner_</string> @@ -924,7 +969,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <string key="superclassName">NSObject</string> <object class="NSMutableDictionary" key="outlets"> <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMutableArray" key="dict.sortedKeys"> + <object class="NSArray" key="dict.sortedKeys"> <bool key="EncodedWithXMLCoder">YES</bool> <string>localizerOwner_</string> <string>localizer_</string> @@ -947,7 +992,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> <string key="superclassName">NSView</string> <object class="NSMutableDictionary" key="outlets"> <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMutableArray" key="dict.sortedKeys"> + <object class="NSArray" key="dict.sortedKeys"> <bool key="EncodedWithXMLCoder">YES</bool> <string>viewToResize_</string> <string>viewToSlideAndResize_</string> @@ -1028,8 +1073,714 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> </object> </object> </object> + <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBPartialClassDescription"> + <string key="className">NSActionCell</string> + <string key="superclassName">NSCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSActionCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <string key="superclassName">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="906419881"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSApplication.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="297019869"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="1020581467"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSBox</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSBox.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSButton</string> + <string key="superclassName">NSControl</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSButton.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSButtonCell</string> + <string key="superclassName">NSActionCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSButtonCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSCell</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSControl</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="287370542"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSControl.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSFormatter</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSFormatter.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMatrix</string> + <string key="superclassName">NSControl</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMatrix.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMenu</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="120889394"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMenu.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AddressBook.framework/Headers/ABActions.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSAlert.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSAnimation.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="906419881"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="297019869"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSBrowser.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="1020581467"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSComboBox.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSComboBoxCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="287370542"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDatePickerCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDragging.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="140035882"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDrawer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSImage.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="120889394"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSRuleEditor.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSSound.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSSpeechRecognizer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSSpeechSynthesizer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSSplitView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTabView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTableView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSText.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTextStorage.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTextView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTokenField.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTokenFieldCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSToolbar.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="235596643"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="960729206"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSWindow.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSArchiver.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSClassDescription.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSConnection.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSError.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSMetadata.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSNetServices.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSObject.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSObjectScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSPort.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSPortCoder.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptClassDescription.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptWhoseTests.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSSpellServer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSStream.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSThread.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURL.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURLDownload.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSXMLParser.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Print.framework/Headers/PDEPluginInterface.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">QuartzCore.framework/Headers/CAAnimation.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">QuartzCore.framework/Headers/CALayer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">QuartzCore.framework/Headers/CIImageProvider.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">SecurityInterface.framework/Headers/SFAuthorizationView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">SecurityInterface.framework/Headers/SFCertificatePanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">SecurityInterface.framework/Headers/SFChooseIdentityPanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSResponder</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSResponder.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTextField</string> + <string key="superclassName">NSControl</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTextField.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTextFieldCell</string> + <string key="superclassName">NSActionCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTextFieldCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSClipView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <string key="superclassName">NSResponder</string> + <reference key="sourceIdentifier" ref="235596643"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <reference key="sourceIdentifier" ref="140035882"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <string key="superclassName">NSResponder</string> + <reference key="sourceIdentifier" ref="960729206"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindowController</string> + <string key="superclassName">NSResponder</string> + <object class="NSMutableDictionary" key="actions"> + <string key="NS.key.0">showWindow:</string> + <string key="NS.object.0">id</string> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSWindowController.h</string> + </object> + </object> + </object> </object> <int key="IBDocument.localizationMode">0</int> + <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> + <integer value="1050" key="NS.object.0"/> + </object> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> + <integer value="1050" key="NS.object.0"/> + </object> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> + <integer value="3000" key="NS.object.0"/> + </object> + <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> <string key="IBDocument.LastKnownRelativeProjectPath">../../chrome.xcodeproj</string> <int key="IBDocument.defaultPropertyAccessControl">3</int> </data> diff --git a/chrome/browser/blocked_plugin_manager.cc b/chrome/browser/blocked_plugin_manager.cc index 92b7c91..b073b1f 100644 --- a/chrome/browser/blocked_plugin_manager.cc +++ b/chrome/browser/blocked_plugin_manager.cc @@ -6,9 +6,13 @@ #include "app/l10n_util.h" #include "app/resource_bundle.h" +#include "base/command_line.h" #include "base/utf_string_conversions.h" +#include "chrome/browser/host_content_settings_map.h" +#include "chrome/browser/profile.h" #include "chrome/browser/renderer_host/render_view_host.h" #include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/common/chrome_switches.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" @@ -16,7 +20,10 @@ BlockedPluginManager::BlockedPluginManager(TabContents* tab_contents) : ConfirmInfoBarDelegate(tab_contents), tab_contents_(tab_contents) { } -void BlockedPluginManager::OnNonSandboxedPluginBlocked(const string16& name) { +void BlockedPluginManager::OnNonSandboxedPluginBlocked( + const std::string& plugin, + const string16& name) { + plugin_ = plugin; name_ = name; tab_contents_->AddInfoBar(this); } @@ -26,12 +33,18 @@ void BlockedPluginManager::OnBlockedPluginLoaded() { } int BlockedPluginManager::GetButtons() const { - return BUTTON_OK; + int buttons = BUTTON_OK; + if (CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableResourceContentSettings)) + buttons |= BUTTON_CANCEL; + return buttons; } std::wstring BlockedPluginManager::GetButtonLabel(InfoBarButton button) const { if (button == BUTTON_OK) return l10n_util::GetString(IDS_PLUGIN_LOAD_SHORT); + if (button == BUTTON_CANCEL) + return l10n_util::GetString(IDS_BLOCKED_PLUGINS_UNBLOCK_SHORT); return ConfirmInfoBarDelegate::GetButtonLabel(button); } @@ -54,6 +67,16 @@ bool BlockedPluginManager::Accept() { return true; } +bool BlockedPluginManager::Cancel() { + DCHECK(CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableResourceContentSettings)); + tab_contents_->profile()->GetHostContentSettingsMap()->AddExceptionForURL( + tab_contents_->GetURL(), CONTENT_SETTINGS_TYPE_PLUGINS, plugin_, + CONTENT_SETTING_ALLOW); + tab_contents_->render_view_host()->LoadBlockedPlugins(); + return true; +} + bool BlockedPluginManager::LinkClicked(WindowOpenDisposition disposition) { // TODO(bauerb): Navigate to a help page explaining why we blocked the plugin, // once we have one. diff --git a/chrome/browser/blocked_plugin_manager.h b/chrome/browser/blocked_plugin_manager.h index e9f9506..a71c42b 100644 --- a/chrome/browser/blocked_plugin_manager.h +++ b/chrome/browser/blocked_plugin_manager.h @@ -15,7 +15,8 @@ class BlockedPluginManager : public RenderViewHostDelegate::BlockedPlugin, public: explicit BlockedPluginManager(TabContents* tab_contents); - virtual void OnNonSandboxedPluginBlocked(const string16& name); + virtual void OnNonSandboxedPluginBlocked(const std::string& plugin, + const string16& name); virtual void OnBlockedPluginLoaded(); // ConfirmInfoBarDelegate methods @@ -25,12 +26,14 @@ class BlockedPluginManager : public RenderViewHostDelegate::BlockedPlugin, virtual std::wstring GetLinkText(); virtual SkBitmap* GetIcon() const; virtual bool Accept(); + virtual bool Cancel(); virtual bool LinkClicked(WindowOpenDisposition disposition); private: // Owns us. TabContents* tab_contents_; string16 name_; + std::string plugin_; }; #endif // CHROME_BROWSER_BLOCKED_PLUGIN_MANAGER_H_ diff --git a/chrome/browser/cocoa/content_setting_bubble_cocoa.h b/chrome/browser/cocoa/content_setting_bubble_cocoa.h index ecdaaf9..ae6f422 100644 --- a/chrome/browser/cocoa/content_setting_bubble_cocoa.h +++ b/chrome/browser/cocoa/content_setting_bubble_cocoa.h @@ -37,6 +37,8 @@ typedef std::map<NSButton*, int> PopupLinks; // The info button of the cookies bubble. IBOutlet NSButton* infoButton_; + IBOutlet NSTextField* blockedResourcesField_; + scoped_ptr<ContentSettingBubbleModel> contentSettingBubbleModel_; content_setting_bubble::PopupLinks popupLinks_; } diff --git a/chrome/browser/cocoa/content_setting_bubble_cocoa.mm b/chrome/browser/cocoa/content_setting_bubble_cocoa.mm index de4f73a..9d34f16 100644 --- a/chrome/browser/cocoa/content_setting_bubble_cocoa.mm +++ b/chrome/browser/cocoa/content_setting_bubble_cocoa.mm @@ -20,6 +20,7 @@ #include "grit/generated_resources.h" #include "skia/ext/skia_utils_mac.h" #import "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h" +#include "webkit/glue/plugins/plugin_list.h" namespace { @@ -88,6 +89,7 @@ NSTextField* LabelWithFrame(NSString* text, const NSRect& frame) { title:(NSString*)title icon:(NSImage*)icon referenceFrame:(NSRect)referenceFrame; +- (void)initializeBlockedPluginsList; - (void)initializeTitle; - (void)initializeRadioGroup; - (void)initializePopupList; @@ -147,6 +149,10 @@ NSTextField* LabelWithFrame(NSString* text, const NSRect& frame) { if (!titleLabel_) return; + NSString* label = base::SysUTF8ToNSString( + contentSettingBubbleModel_->bubble_content().title); + [titleLabel_ setStringValue:label]; + // Layout title post-localization. CGFloat deltaY = [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:titleLabel_]; @@ -161,20 +167,22 @@ NSTextField* LabelWithFrame(NSString* text, const NSRect& frame) { - (void)initializeRadioGroup { // Configure the radio group. For now, only deal with the // strictly needed case of group containing 2 radio buttons. - // TODO(joth): Implement the generic case, getting localized strings from the - // bubble model instead of the xib, or remove it if it's never needed. - // http://crbug.com/38432 - const ContentSettingBubbleModel::RadioGroup& radioGroup = + const ContentSettingBubbleModel::RadioGroup& radio_group = contentSettingBubbleModel_->bubble_content().radio_group; // Select appropriate radio button. [allowBlockRadioGroup_ selectCellWithTag: - radioGroup.default_item == 0 ? kAllowTag : kBlockTag]; + radio_group.default_item == 0 ? kAllowTag : kBlockTag]; - // Copy |host_| into radio group label. + const ContentSettingBubbleModel::RadioItems& radio_items = + radio_group.radio_items; + DCHECK_EQ(2u, radio_items.size()) << "Only 2 radio items per group supported"; + // Set radio group labels from model. NSCell* radioCell = [allowBlockRadioGroup_ cellWithTag:kAllowTag]; - [radioCell setTitle:cocoa_l10n_util::ReplaceNSStringPlaceholders( - [radioCell title], UTF8ToUTF16(radioGroup.url.host()), NULL)]; + [radioCell setTitle:base::SysUTF8ToNSString(radio_items[0])]; + + radioCell = [allowBlockRadioGroup_ cellWithTag:kBlockTag]; + [radioCell setTitle:base::SysUTF8ToNSString(radio_items[1])]; // Layout radio group labels post-localization. [GTMUILocalizerAndLayoutTweaker @@ -219,6 +227,37 @@ NSTextField* LabelWithFrame(NSString* text, const NSRect& frame) { return button; } +- (void)initializeBlockedPluginsList { + NSMutableArray* pluginArray = [NSMutableArray array]; + const std::set<std::string>& plugins = + contentSettingBubbleModel_->bubble_content().resource_identifiers; + if (plugins.empty()) { + int delta = NSMinY([titleLabel_ frame]) - + NSMinY([blockedResourcesField_ frame]); + [blockedResourcesField_ removeFromSuperview]; + NSRect frame = [[self window] frame]; + frame.size.height -= delta; + [[self window] setFrame:frame display:NO]; + } else { + for (std::set<std::string>::iterator it = plugins.begin(); + it != plugins.end(); ++it) { + WebPluginInfo plugin; + NSString* name; + if (NPAPI::PluginList::Singleton()-> + GetPluginInfoByPath(FilePath(*it), &plugin)) { + name = base::SysUTF16ToNSString(plugin.name); + } else { + name = base::SysUTF8ToNSString(*it); + } + [pluginArray addObject:name]; + } + [blockedResourcesField_ + setStringValue:[pluginArray componentsJoinedByString:@"\n"]]; + [GTMUILocalizerAndLayoutTweaker + sizeToFitFixedWidthTextField:blockedResourcesField_]; + } +} + - (void)initializePopupList { // I didn't put the buttons into a NSMatrix because then they are only one // entity in the key view loop. This way, one can tab through all of them. @@ -419,8 +458,10 @@ NSTextField* LabelWithFrame(NSString* text, const NSRect& frame) { [self initializeTitle]; ContentSettingsType type = contentSettingBubbleModel_->content_type(); - if (type == CONTENT_SETTINGS_TYPE_PLUGINS) + if (type == CONTENT_SETTINGS_TYPE_PLUGINS) { [self sizeToFitLoadPluginsButton]; + [self initializeBlockedPluginsList]; + } if (type == CONTENT_SETTINGS_TYPE_COOKIES) [self removeInfoButton]; if (allowBlockRadioGroup_) // not bound in cookie bubble xib diff --git a/chrome/browser/content_setting_bubble_model.cc b/chrome/browser/content_setting_bubble_model.cc index 7fc7462..fd0cae1 100644 --- a/chrome/browser/content_setting_bubble_model.cc +++ b/chrome/browser/content_setting_bubble_model.cc @@ -29,21 +29,43 @@ class ContentSettingTitleAndLinkModel : public ContentSettingBubbleModel { : ContentSettingBubbleModel(tab_contents, profile, content_type) { // Notifications do not have a bubble. DCHECK_NE(content_type, CONTENT_SETTINGS_TYPE_NOTIFICATIONS); + SetBlockedResources(); SetTitle(); SetManageLink(); } private: + void SetBlockedResources() { + TabSpecificContentSettings* settings = + tab_contents()->GetTabSpecificContentSettings(); + const std::set<std::string>& resources = settings->BlockedResourcesForType( + content_type()); + for (std::set<std::string>::const_iterator it = resources.begin(); + it != resources.end(); ++it) { + AddBlockedResource(*it); + } + } + void SetTitle() { static const int kBlockedTitleIDs[] = { IDS_BLOCKED_COOKIES_TITLE, IDS_BLOCKED_IMAGES_TITLE, IDS_BLOCKED_JAVASCRIPT_TITLE, - IDS_BLOCKED_PLUGINS_TITLE, + IDS_BLOCKED_PLUGINS_MESSAGE, IDS_BLOCKED_POPUPS_TITLE, 0, // Geolocation does not have an overall title. 0, // Notifications do not have a bubble. }; + // Fields as for kBlockedTitleIDs, above. + static const int kResourceSpecificBlockedTitleIDs[] = { + 0, + 0, + 0, + IDS_BLOCKED_PLUGINS_TITLE, + 0, + 0, + 0, + }; static const int kAccessedTitleIDs[] = { IDS_ACCESSED_COOKIES_TITLE, 0, @@ -57,6 +79,9 @@ class ContentSettingTitleAndLinkModel : public ContentSettingBubbleModel { Need_a_setting_for_every_content_settings_type); COMPILE_ASSERT(arraysize(kBlockedTitleIDs) == CONTENT_SETTINGS_NUM_TYPES, Need_a_setting_for_every_content_settings_type); + COMPILE_ASSERT(arraysize(kResourceSpecificBlockedTitleIDs) == + CONTENT_SETTINGS_NUM_TYPES, + Need_a_setting_for_every_content_settings_type); const int *title_ids = kBlockedTitleIDs; if (tab_contents() && tab_contents()->GetTabSpecificContentSettings()->IsContentAccessed( @@ -64,8 +89,11 @@ class ContentSettingTitleAndLinkModel : public ContentSettingBubbleModel { !tab_contents()->GetTabSpecificContentSettings()->IsContentBlocked( content_type()) && !CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableCookiePrompt)) + switches::kEnableCookiePrompt)) { title_ids = kAccessedTitleIDs; + } else if (!bubble_content().resource_identifiers.empty()) { + title_ids = kResourceSpecificBlockedTitleIDs; + } if (title_ids[content_type()]) set_title(l10n_util::GetStringUTF8(title_ids[content_type()])); } @@ -151,6 +179,9 @@ class ContentSettingSingleRadioGroup : public ContentSettingTitleAndLinkModel { &display_host_wide, NULL, NULL); std::string display_host(WideToUTF8(display_host_wide)); + const std::set<std::string>& resources = + bubble_content().resource_identifiers; + RadioGroup radio_group; radio_group.url = url; @@ -158,16 +189,31 @@ class ContentSettingSingleRadioGroup : public ContentSettingTitleAndLinkModel { 0, // We don't manage cookies here. IDS_BLOCKED_IMAGES_UNBLOCK, IDS_BLOCKED_JAVASCRIPT_UNBLOCK, - IDS_BLOCKED_PLUGINS_UNBLOCK, + IDS_BLOCKED_PLUGINS_UNBLOCK_ALL, IDS_BLOCKED_POPUPS_UNBLOCK, 0, // We don't manage geolocation here. 0, // Notifications do not have a bubble. }; COMPILE_ASSERT(arraysize(kAllowIDs) == CONTENT_SETTINGS_NUM_TYPES, Need_a_setting_for_every_content_settings_type); + // Fields as for kAllowIDs, above. + static const int kResourceSpecificAllowIDs[] = { + 0, + 0, + 0, + IDS_BLOCKED_PLUGINS_UNBLOCK, + 0, + 0, + 0, + }; + COMPILE_ASSERT( + arraysize(kResourceSpecificAllowIDs) == CONTENT_SETTINGS_NUM_TYPES, + Need_a_setting_for_every_content_settings_type); std::string radio_allow_label; + const int* allowIDs = resources.empty() ? + kAllowIDs : kResourceSpecificAllowIDs; radio_allow_label = l10n_util::GetStringFUTF8( - kAllowIDs[content_type()], UTF8ToUTF16(display_host)); + allowIDs[content_type()], UTF8ToUTF16(display_host)); static const int kBlockIDs[] = { 0, // We don't manage cookies here. @@ -186,18 +232,48 @@ class ContentSettingSingleRadioGroup : public ContentSettingTitleAndLinkModel { radio_group.radio_items.push_back(radio_allow_label); radio_group.radio_items.push_back(radio_block_label); - radio_group.default_item = - profile()->GetHostContentSettingsMap()->GetContentSetting(url, - content_type(), "") == CONTENT_SETTING_ALLOW ? 0 : 1; + HostContentSettingsMap* map = profile()->GetHostContentSettingsMap(); + if (resources.empty()) { + ContentSetting setting = map->GetContentSetting(url, content_type(), + std::string()); + radio_group.default_item = (setting == CONTENT_SETTING_ALLOW) ? 0 : 1; + } else { + // The default item is "block" if at least one of the resources + // is blocked. + radio_group.default_item = 0; + for (std::set<std::string>::const_iterator it = resources.begin(); + it != resources.end(); ++it) { + ContentSetting setting = map->GetContentSetting( + url, content_type(), *it); + if (setting == CONTENT_SETTING_BLOCK) { + radio_group.default_item = 1; + break; + } + } + } set_radio_group(radio_group); } - virtual void OnRadioClicked(int radio_index) { + void AddException(ContentSetting setting, + const std::string& resource_identifier) { profile()->GetHostContentSettingsMap()->AddExceptionForURL( - bubble_content().radio_group.url, - content_type(), - "", - radio_index == 0 ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); + bubble_content().radio_group.url, content_type(), resource_identifier, + setting); + } + + virtual void OnRadioClicked(int radio_index) { + ContentSetting setting = + radio_index == 0 ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; + const std::set<std::string>& resources = + bubble_content().resource_identifiers; + if (resources.empty()) { + AddException(setting, std::string()); + } else { + for (std::set<std::string>::const_iterator it = resources.begin(); + it != resources.end(); ++it) { + AddException(setting, *it); + } + } } }; @@ -386,6 +462,11 @@ ContentSettingBubbleModel::ContentSettingBubbleModel( ContentSettingBubbleModel::~ContentSettingBubbleModel() { } +void ContentSettingBubbleModel::AddBlockedResource( + const std::string& resource_identifier) { + bubble_content_.resource_identifiers.insert(resource_identifier); +} + void ContentSettingBubbleModel::Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) { diff --git a/chrome/browser/content_setting_bubble_model.h b/chrome/browser/content_setting_bubble_model.h index 3d7c08a..97664d8 100644 --- a/chrome/browser/content_setting_bubble_model.h +++ b/chrome/browser/content_setting_bubble_model.h @@ -58,6 +58,7 @@ class ContentSettingBubbleModel : public NotificationObserver { PopupItems popup_items; RadioGroup radio_group; std::vector<DomainList> domain_lists; + std::set<std::string> resource_identifiers; std::string manage_link; std::string clear_link; std::string info_link; @@ -111,6 +112,7 @@ class ContentSettingBubbleModel : public NotificationObserver { void set_load_plugins_link_enabled(bool enabled) { bubble_content_.load_plugins_link_enabled = enabled; } + void AddBlockedResource(const std::string& resource_identifier); private: TabContents* tab_contents_; diff --git a/chrome/browser/content_setting_bubble_model_unittest.cc b/chrome/browser/content_setting_bubble_model_unittest.cc index 7a77fb9..3f443cf 100644 --- a/chrome/browser/content_setting_bubble_model_unittest.cc +++ b/chrome/browser/content_setting_bubble_model_unittest.cc @@ -47,7 +47,8 @@ class ContentSettingBubbleModelTest : public RenderViewHostTestHarness { TEST_F(ContentSettingBubbleModelTest, ImageRadios) { TabSpecificContentSettings* content_settings = contents()->GetTabSpecificContentSettings(); - content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES); + content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES, + std::string()); scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model( ContentSettingBubbleModel::CreateContentSettingBubbleModel( @@ -65,7 +66,8 @@ TEST_F(ContentSettingBubbleModelTest, ImageRadios) { TEST_F(ContentSettingBubbleModelTest, Cookies) { TabSpecificContentSettings* content_settings = contents()->GetTabSpecificContentSettings(); - content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES); + content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, + std::string()); scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model( ContentSettingBubbleModel::CreateContentSettingBubbleModel( @@ -82,7 +84,8 @@ TEST_F(ContentSettingBubbleModelTest, Cookies) { TEST_F(ContentSettingBubbleModelTest, Plugins) { TabSpecificContentSettings* content_settings = contents()->GetTabSpecificContentSettings(); - content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS); + content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS, + std::string()); scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model( ContentSettingBubbleModel::CreateContentSettingBubbleModel( diff --git a/chrome/browser/content_setting_image_model.cc b/chrome/browser/content_setting_image_model.cc index e45aead..0593991 100644 --- a/chrome/browser/content_setting_image_model.cc +++ b/chrome/browser/content_setting_image_model.cc @@ -61,7 +61,7 @@ const int ContentSettingBlockedImageModel::kBlockedTooltipIDs[] = { IDS_BLOCKED_COOKIES_TITLE, IDS_BLOCKED_IMAGES_TITLE, IDS_BLOCKED_JAVASCRIPT_TITLE, - IDS_BLOCKED_PLUGINS_TITLE, + IDS_BLOCKED_PLUGINS_MESSAGE, IDS_BLOCKED_POPUPS_TOOLTIP, }; diff --git a/chrome/browser/content_setting_image_model_unittest.cc b/chrome/browser/content_setting_image_model_unittest.cc index 32aed3e..f16ab93 100644 --- a/chrome/browser/content_setting_image_model_unittest.cc +++ b/chrome/browser/content_setting_image_model_unittest.cc @@ -35,7 +35,8 @@ TEST_F(ContentSettingImageModelTest, UpdateFromTabContents) { EXPECT_EQ(0, content_setting_image_model->get_icon()); EXPECT_EQ(std::string(), content_setting_image_model->get_tooltip()); - content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES); + content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES, + std::string()); content_setting_image_model->UpdateFromTabContents(&tab_contents); EXPECT_TRUE(content_setting_image_model->is_visible()); diff --git a/chrome/browser/gtk/content_setting_bubble_gtk.cc b/chrome/browser/gtk/content_setting_bubble_gtk.cc index d0d4a56..d9edf39 100644 --- a/chrome/browser/gtk/content_setting_bubble_gtk.cc +++ b/chrome/browser/gtk/content_setting_bubble_gtk.cc @@ -6,6 +6,7 @@ #include "app/l10n_util.h" #include "base/i18n/rtl.h" +#include "base/utf_string_conversions.h" #include "chrome/browser/blocked_popup_container.h" #include "chrome/browser/content_setting_bubble_model.h" #include "chrome/browser/gtk/gtk_chrome_link_button.h" @@ -21,6 +22,7 @@ #include "gfx/gtk_util.h" #include "grit/app_resources.h" #include "grit/generated_resources.h" +#include "webkit/glue/plugins/plugin_list.h" // Padding between content and edge of info bubble. static const int kContentBorder = 7; @@ -79,6 +81,33 @@ void ContentSettingBubbleGtk::BuildBubble() { gtk_box_pack_start(GTK_BOX(bubble_content), label, FALSE, FALSE, 0); } + const std::set<std::string>& plugins = content.resource_identifiers; + if (!plugins.empty()) { + GtkWidget* list_content = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); + + for (std::set<std::string>::const_iterator it = plugins.begin(); + it != plugins.end(); ++it) { + WebPluginInfo plugin; + std::string name; + if (NPAPI::PluginList::Singleton()->GetPluginInfoByPath(FilePath(*it), + &plugin)) { + name = UTF16ToUTF8(plugin.name); + } else { + name = *it; + } + + GtkWidget* label = gtk_label_new(name.c_str()); + GtkWidget* label_box = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(label_box), label, FALSE, FALSE, 0); + + gtk_box_pack_start(GTK_BOX(list_content), + label_box, + FALSE, FALSE, 0); + } + gtk_box_pack_start(GTK_BOX(bubble_content), list_content, FALSE, FALSE, + gtk_util::kControlSpacing); + } + if (content_setting_bubble_model_->content_type() == CONTENT_SETTINGS_TYPE_POPUPS) { const std::vector<ContentSettingBubbleModel::PopupItem>& popup_items = diff --git a/chrome/browser/host_content_settings_map.cc b/chrome/browser/host_content_settings_map.cc index dabdc96..0e10e25 100644 --- a/chrome/browser/host_content_settings_map.cc +++ b/chrome/browser/host_content_settings_map.cc @@ -279,7 +279,7 @@ ContentSetting HostContentSettingsMap::GetNonDefaultContentSetting( return GetNonDefaultContentSettings(url).settings[content_type]; if (CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableClickToPlay)) { + switches::kEnableResourceContentSettings)) { DCHECK(!resource_identifier.empty()); } @@ -405,11 +405,8 @@ void HostContentSettingsMap::GetSettingsForOneType( ContentSettingsType content_type, const std::string& resource_identifier, SettingsForOneType* settings) const { - if (CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableClickToPlay)) { - DCHECK(!RequiresResourceIdentifier(content_type) || - !resource_identifier.empty()); - } + DCHECK(RequiresResourceIdentifier(content_type) != + resource_identifier.empty()); DCHECK(settings); settings->clear(); @@ -485,11 +482,8 @@ void HostContentSettingsMap::SetContentSetting( ContentSetting setting) { DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation. DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); - if (CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableClickToPlay)) { - DCHECK(!RequiresResourceIdentifier(content_type) || - !resource_identifier.empty()); - } + DCHECK(RequiresResourceIdentifier(content_type) != + resource_identifier.empty()); bool early_exit = false; std::string pattern_str(pattern.AsString()); @@ -656,14 +650,12 @@ void HostContentSettingsMap::ClearSettingsForOneType( bool HostContentSettingsMap::RequiresResourceIdentifier( ContentSettingsType content_type) const { -// TODO(bauerb): Enable once all call sites are adopted. -#if 0 if (CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableClickToPlay)) + switches::kEnableResourceContentSettings)) { return kRequiresResourceIdentifier[content_type]; - else -#endif + } else { return false; + } } void HostContentSettingsMap::SetBlockThirdPartyCookies(bool block) { diff --git a/chrome/browser/host_content_settings_map_unittest.cc b/chrome/browser/host_content_settings_map_unittest.cc index 7690c86..f19f7a2 100644 --- a/chrome/browser/host_content_settings_map_unittest.cc +++ b/chrome/browser/host_content_settings_map_unittest.cc @@ -550,9 +550,6 @@ TEST_F(HostContentSettingsMapTest, NonDefaultSettings) { EXPECT_TRUE(SettingsEqual(desired_settings, settings)); } -// TODO(bauerb): Enable once HostContentSettingsMap::RequiersResourceIdentifier -// is changed. -#if 0 TEST_F(HostContentSettingsMapTest, ResourceIdentifier) { // This feature is currently behind a flag. CommandLine cl(*CommandLine::ForCurrentProcess()); @@ -584,7 +581,8 @@ TEST_F(HostContentSettingsMapTest, ResourceIdentifier) { TEST_F(HostContentSettingsMapTest, ResourceIdentifierPrefs) { // This feature is currently behind a flag. CommandLine cl(*CommandLine::ForCurrentProcess()); - CommandLine::ForCurrentProcess()->AppendSwitch(switches::kEnableClickToPlay); + CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kEnableResourceContentSettings); TestingProfile profile; profile.GetPrefs()->SetUserPref(prefs::kContentSettingsPatterns, @@ -621,6 +619,5 @@ TEST_F(HostContentSettingsMapTest, ResourceIdentifierPrefs) { prefs_as_json.c_str()); *CommandLine::ForCurrentProcess() = cl; } -#endif } // namespace diff --git a/chrome/browser/renderer_host/browser_render_process_host.cc b/chrome/browser/renderer_host/browser_render_process_host.cc index a9af09a..98397cd 100644 --- a/chrome/browser/renderer_host/browser_render_process_host.cc +++ b/chrome/browser/renderer_host/browser_render_process_host.cc @@ -577,6 +577,7 @@ void BrowserRenderProcessHost::PropagateBrowserCommandLineToRenderer( switches::kDisableOutdatedPlugins, switches::kEnableRemoting, switches::kEnableClickToPlay, + switches::kEnableResourceContentSettings, switches::kPrelaunchGpuProcess, switches::kEnableContentPrefetch, switches::kDisableContentPrefetch, diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index b957d28..a03f4e4 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -1536,11 +1536,12 @@ void RenderViewHost::OnMissingPluginStatus(int status) { integration_delegate->OnMissingPluginStatus(status); } -void RenderViewHost::OnNonSandboxedPluginBlocked(const string16& name) { +void RenderViewHost::OnNonSandboxedPluginBlocked(const std::string& plugin, + const string16& name) { RenderViewHostDelegate::BlockedPlugin* blocked_plugin_delegate = delegate_->GetBlockedPluginDelegate(); if (blocked_plugin_delegate) { - blocked_plugin_delegate->OnNonSandboxedPluginBlocked(name); + blocked_plugin_delegate->OnNonSandboxedPluginBlocked(plugin, name); } } @@ -1996,11 +1997,12 @@ void RenderViewHost::OnPageTranslated(int32 page_id, translated_lang, error_type); } -void RenderViewHost::OnContentBlocked(ContentSettingsType type) { +void RenderViewHost::OnContentBlocked(ContentSettingsType type, + const std::string& resource_identifier) { RenderViewHostDelegate::ContentSettings* content_settings_delegate = delegate_->GetContentSettingsDelegate(); if (content_settings_delegate) - content_settings_delegate->OnContentBlocked(type); + content_settings_delegate->OnContentBlocked(type, resource_identifier); } void RenderViewHost::OnAppCacheAccessed(const GURL& manifest_url, diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h index b47bb57..9e489e9 100644 --- a/chrome/browser/renderer_host/render_view_host.h +++ b/chrome/browser/renderer_host/render_view_host.h @@ -599,7 +599,8 @@ class RenderViewHost : public RenderWidgetHost { void OnUserMetricsRecordAction(const std::string& action); void OnMissingPluginStatus(int status); - void OnNonSandboxedPluginBlocked(const string16& name); + void OnNonSandboxedPluginBlocked(const std::string& plugin, + const string16& name); void OnBlockedPluginLoaded(); void OnCrashedPlugin(const FilePath& plugin_path); void OnDisabledOutdatedPlugin(const string16& name, const GURL& update_url); @@ -651,7 +652,8 @@ class RenderViewHost : public RenderWidgetHost { const std::string& original_lang, const std::string& translated_lang, TranslateErrors::Type error_type); - void OnContentBlocked(ContentSettingsType type); + void OnContentBlocked(ContentSettingsType type, + const std::string& resource_identifier); void OnAppCacheAccessed(const GURL& manifest_url, bool blocked_by_policy); void OnWebDatabaseAccessed(const GURL& url, const string16& name, diff --git a/chrome/browser/renderer_host/render_view_host_delegate.h b/chrome/browser/renderer_host/render_view_host_delegate.h index 0be5784..13c728e 100644 --- a/chrome/browser/renderer_host/render_view_host_delegate.h +++ b/chrome/browser/renderer_host/render_view_host_delegate.h @@ -344,7 +344,8 @@ class RenderViewHostDelegate { public: // Called when content in the current page was blocked due to the user's // content settings. - virtual void OnContentBlocked(ContentSettingsType type) = 0; + virtual void OnContentBlocked(ContentSettingsType type, + const std::string& resource_identifier) = 0; // Called when a specific cookie in the current page was accessed. // |blocked_by_policy| should be true, if the cookie was blocked due to the @@ -544,7 +545,8 @@ class RenderViewHostDelegate { class BlockedPlugin { public: - virtual void OnNonSandboxedPluginBlocked(const string16& name) = 0; + virtual void OnNonSandboxedPluginBlocked(const std::string& plugin, + const string16& name) = 0; virtual void OnBlockedPluginLoaded() = 0; }; diff --git a/chrome/browser/renderer_host/resource_message_filter.cc b/chrome/browser/renderer_host/resource_message_filter.cc index c123007..c06ef55 100644 --- a/chrome/browser/renderer_host/resource_message_filter.cc +++ b/chrome/browser/renderer_host/resource_message_filter.cc @@ -716,6 +716,7 @@ void ResourceMessageFilter::OnGetPluginInfo(const GURL& url, const std::string& mime_type, bool* found, WebPluginInfo* info, + ContentSetting* setting, std::string* actual_mime_type) { bool allow_wildcard = true; *found = NPAPI::PluginList::Singleton()->GetPluginInfo(url, @@ -726,6 +727,14 @@ void ResourceMessageFilter::OnGetPluginInfo(const GURL& url, if (*found) { info->enabled = info->enabled && plugin_service_->PrivatePluginAllowedForURL(info->path, policy_url); + HostContentSettingsMap* map = profile_->GetHostContentSettingsMap(); + *setting = map->GetNonDefaultContentSetting( + policy_url, CONTENT_SETTINGS_TYPE_PLUGINS, info->path.ToString()); + if (*setting == CONTENT_SETTING_DEFAULT && + map->GetDefaultContentSetting(CONTENT_SETTINGS_TYPE_PLUGINS) == + CONTENT_SETTING_BLOCK) { + *setting = CONTENT_SETTING_BLOCK; + } } } diff --git a/chrome/browser/renderer_host/resource_message_filter.h b/chrome/browser/renderer_host/resource_message_filter.h index 19320e0..152d978 100644 --- a/chrome/browser/renderer_host/resource_message_filter.h +++ b/chrome/browser/renderer_host/resource_message_filter.h @@ -24,6 +24,7 @@ #include "build/build_config.h" #include "chrome/browser/net/resolve_proxy_msg_helper.h" #include "chrome/browser/renderer_host/resource_dispatcher_host.h" +#include "chrome/common/content_settings.h" #include "chrome/common/window_container_type.h" #include "gfx/native_widget_types.h" #include "ipc/ipc_channel_proxy.h" @@ -183,6 +184,7 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, const std::string& mime_type, bool* found, WebPluginInfo* info, + ContentSetting* setting, std::string* actual_mime_type); void OnOpenChannelToPlugin(const GURL& url, const std::string& mime_type, diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc index 42f63db..30e74e7 100644 --- a/chrome/browser/tab_contents/tab_contents.cc +++ b/chrome/browser/tab_contents/tab_contents.cc @@ -1512,7 +1512,8 @@ void TabContents::AddPopup(TabContents* new_contents, if (!blocked_popups_) blocked_popups_ = new BlockedPopupContainer(this); blocked_popups_->AddTabContents(new_contents, initial_pos); - content_settings_delegate_->OnContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS); + content_settings_delegate_->OnContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS, + std::string()); } } diff --git a/chrome/browser/tab_contents/tab_specific_content_settings.cc b/chrome/browser/tab_contents/tab_specific_content_settings.cc index 14a921e..2070eb7 100644 --- a/chrome/browser/tab_contents/tab_specific_content_settings.cc +++ b/chrome/browser/tab_contents/tab_specific_content_settings.cc @@ -47,12 +47,35 @@ bool TabSpecificContentSettings::IsContentAccessed( return content_accessed_[content_type]; } -void TabSpecificContentSettings::OnContentBlocked(ContentSettingsType type) { +const std::set<std::string>& + TabSpecificContentSettings::BlockedResourcesForType( + ContentSettingsType content_type) const { + if (blocked_resources_[content_type].get()) { + return *blocked_resources_[content_type]; + } else { + static std::set<std::string> empty_set; + return empty_set; + } +} + +void TabSpecificContentSettings::AddBlockedResource( + ContentSettingsType content_type, + const std::string& resource_identifier) { + if (!blocked_resources_[content_type].get()) + blocked_resources_[content_type].reset(new std::set<std::string>()); + blocked_resources_[content_type]->insert(resource_identifier); +} + +void TabSpecificContentSettings::OnContentBlocked( + ContentSettingsType type, + const std::string& resource_identifier) { DCHECK(type != CONTENT_SETTINGS_TYPE_GEOLOCATION) << "Geolocation settings handled by OnGeolocationPermissionSet"; content_accessed_[type] = true; if (!content_blocked_[type]) { content_blocked_[type] = true; + if (!resource_identifier.empty()) + AddBlockedResource(type, resource_identifier); if (delegate_) delegate_->OnContentSettingsAccessed(true); } @@ -75,7 +98,7 @@ void TabSpecificContentSettings::OnCookieAccessed( if (blocked_by_policy) { blocked_local_shared_objects_.cookies()->SetCookieWithOptions( url, cookie_line, options); - OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES); + OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string()); } else { allowed_local_shared_objects_.cookies()->SetCookieWithOptions( url, cookie_line, options); @@ -95,7 +118,7 @@ void TabSpecificContentSettings::OnLocalStorageAccessed( helper->AddLocalStorage(url); if (blocked_by_policy) - OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES); + OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string()); else OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES); } @@ -109,7 +132,7 @@ void TabSpecificContentSettings::OnWebDatabaseAccessed( if (blocked_by_policy) { blocked_local_shared_objects_.databases()->AddDatabase( url, UTF16ToUTF8(name), UTF16ToUTF8(display_name)); - OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES); + OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string()); } else { allowed_local_shared_objects_.databases()->AddDatabase( url, UTF16ToUTF8(name), UTF16ToUTF8(display_name)); @@ -121,7 +144,7 @@ void TabSpecificContentSettings::OnAppCacheAccessed( const GURL& manifest_url, bool blocked_by_policy) { if (blocked_by_policy) { blocked_local_shared_objects_.appcaches()->AddAppCache(manifest_url); - OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES); + OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string()); } else { allowed_local_shared_objects_.appcaches()->AddAppCache(manifest_url); OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES); @@ -150,6 +173,7 @@ TabSpecificContentSettings::TabSpecificContentSettings( void TabSpecificContentSettings::ClearBlockedContentSettings() { for (size_t i = 0; i < arraysize(content_blocked_); ++i) { + blocked_resources_[i].reset(); content_blocked_[i] = false; content_accessed_[i] = false; } diff --git a/chrome/browser/tab_contents/tab_specific_content_settings.h b/chrome/browser/tab_contents/tab_specific_content_settings.h index 82976c4..f6ec971 100644 --- a/chrome/browser/tab_contents/tab_specific_content_settings.h +++ b/chrome/browser/tab_contents/tab_specific_content_settings.h @@ -60,6 +60,9 @@ class TabSpecificContentSettings // only tracks cookies. bool IsContentAccessed(ContentSettingsType content_type) const; + const std::set<std::string>& BlockedResourcesForType( + ContentSettingsType content_type) const; + // Returns the GeolocationSettingsState that controls the // geolocation API usage on this page. const GeolocationSettingsState& geolocation_settings_state() const { @@ -78,7 +81,8 @@ class TabSpecificContentSettings } // RenderViewHostDelegate::ContentSettings implementation. - virtual void OnContentBlocked(ContentSettingsType type); + virtual void OnContentBlocked(ContentSettingsType type, + const std::string& resource_identifier); virtual void OnCookieAccessed(const GURL& url, const std::string& cookie_line, bool blocked_by_policy); @@ -132,6 +136,9 @@ class TabSpecificContentSettings scoped_refptr<CannedBrowsingDataLocalStorageHelper> session_storages_; }; + void AddBlockedResource(ContentSettingsType content_type, + const std::string& resource_identifier); + void OnContentAccessed(ContentSettingsType type); // Stores which content setting types actually have blocked content. @@ -140,6 +147,11 @@ class TabSpecificContentSettings // Stores which content setting types actually were accessed. bool content_accessed_[CONTENT_SETTINGS_NUM_TYPES]; + // Stores the blocked resources for each content type. + // Currently only used for plugins. + scoped_ptr<std::set<std::string> > + blocked_resources_[CONTENT_SETTINGS_NUM_TYPES]; + // Stores the blocked/allowed cookies. LocalSharedObjectsContainer allowed_local_shared_objects_; LocalSharedObjectsContainer blocked_local_shared_objects_; diff --git a/chrome/browser/tab_contents/tab_specific_content_settings_unittest.cc b/chrome/browser/tab_contents/tab_specific_content_settings_unittest.cc index 6129f7d..ed4d836 100644 --- a/chrome/browser/tab_contents/tab_specific_content_settings_unittest.cc +++ b/chrome/browser/tab_contents/tab_specific_content_settings_unittest.cc @@ -55,7 +55,8 @@ TEST(TabSpecificContentSettingsTest, BlockedContent) { EXPECT_TRUE(test_delegate.SettingsChanged()); EXPECT_FALSE(test_delegate.ContentBlocked()); test_delegate.Reset(); - content_settings.OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES); + content_settings.OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES, + std::string()); EXPECT_TRUE(test_delegate.SettingsChanged()); EXPECT_TRUE(test_delegate.ContentBlocked()); test_delegate.Reset(); diff --git a/chrome/browser/views/content_setting_bubble_views.cc b/chrome/browser/views/content_setting_bubble_views.cc index f0f541e..769f5a2 100644 --- a/chrome/browser/views/content_setting_bubble_views.cc +++ b/chrome/browser/views/content_setting_bubble_views.cc @@ -27,6 +27,7 @@ #include "views/controls/separator.h" #include "views/grid_layout.h" #include "views/standard_layout.h" +#include "webkit/glue/plugins/plugin_list.h" class ContentSettingBubbleContents::Favicon : public views::ImageView { public: @@ -201,6 +202,24 @@ void ContentSettingBubbleContents::InitControlLayout() { layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); } + const std::set<std::string>& plugins = bubble_content.resource_identifiers; + if (!plugins.empty()) { + for (std::set<std::string>::const_iterator it = plugins.begin(); + it != plugins.end(); ++it) { + WebPluginInfo plugin; + std::wstring name; + if (NPAPI::PluginList::Singleton()->GetPluginInfoByPath( + FilePath::FromString(*it), &plugin)) { + name = UTF16ToWide(plugin.name); + } else { + name = UTF8ToWide(*it); + } + layout->StartRow(0, single_column_set_id); + layout->AddView(new views::Label(name)); + } + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); + } + if (content_setting_bubble_model_->content_type() == CONTENT_SETTINGS_TYPE_POPUPS) { const int popup_column_set_id = 2; diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 3f8b0f5..53cc519 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc @@ -396,6 +396,10 @@ const char kEnableNaCl[] = "enable-nacl"; // Enable Native Web Worker support. const char kEnableNativeWebWorkers[] = "enable-native-web-workers"; +// Enable content settings based on host *and* plug-in. +const char kEnableResourceContentSettings[] = + "enable-resource-content-settings"; + // Enable speculative TCP/IP preconnection. const char kEnablePreconnect[] = "enable-preconnect"; diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index dde93de..bd2f42b 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h @@ -131,6 +131,7 @@ extern const char kEnableNativeWebWorkers[]; extern const char kEnablePreconnect[]; extern const char kEnablePreparsedJsCaching[]; extern const char kEnablePrintPreview[]; +extern const char kEnableResourceContentSettings[]; extern const char kEnableSearchProviderApiV2[]; extern const char kEnableSpeechInput[]; extern const char kEnableStatsTable[]; diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index 7eb594d..68df701 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -1268,12 +1268,23 @@ IPC_BEGIN_MESSAGES(ViewHost) // Return information about a plugin for the given URL and MIME type. If there // is no matching plugin, |found| is set to false. - IPC_SYNC_MESSAGE_CONTROL3_3(ViewHostMsg_GetPluginInfo, + // If |enabled| in the WebPluginInfo struct is false, the plug-in is basically + // treated as if it was not installed at all. + // If |setting| is set to CONTENT_SETTING_BLOCK, the plug-in is blocked by the + // content settings for |policy_url|. It still appears in navigator.plugins in + // Javascript though, and can be loaded via click-to-play. + // If |setting| is set to CONTENT_SETTING_ALLOW, the domain is explicitly + // white-listed for the plug-in. + // If |setting| is set to CONTENT_SETTING_DEFAULT, the plug-in is neither + // blocked nor white-listed, which means that it's allowed by default and + // can still be blocked if it's non-sandboxed. + IPC_SYNC_MESSAGE_CONTROL3_4(ViewHostMsg_GetPluginInfo, GURL /* url */, GURL /* policy_url */, std::string /* mime_type */, bool /* found */, WebPluginInfo /* plugin info */, + ContentSetting /* setting */, std::string /* actual_mime_type */) // Requests spellcheck for a word. @@ -1304,8 +1315,9 @@ IPC_BEGIN_MESSAGES(ViewHost) // Tells the browser that content in the current page was blocked due to the // user's content settings. - IPC_MESSAGE_ROUTED1(ViewHostMsg_ContentBlocked, - ContentSettingsType /* type of blocked content */) + IPC_MESSAGE_ROUTED2(ViewHostMsg_ContentBlocked, + ContentSettingsType, /* type of blocked content */ + std::string /* resource identifier */) // Tells the browser that a specific Appcache manifest in the current page // was accessed. @@ -1693,7 +1705,8 @@ IPC_BEGIN_MESSAGES(ViewHost) int /* status */) // Notifies when a non-sandboxed plugin was blocked. - IPC_MESSAGE_ROUTED1(ViewHostMsg_NonSandboxedPluginBlocked, + IPC_MESSAGE_ROUTED2(ViewHostMsg_NonSandboxedPluginBlocked, + std::string /* plugin */, string16 /* name */) // Notifies when a blocked plugin was loaded via click-to-load. diff --git a/chrome/renderer/blocked_plugin.cc b/chrome/renderer/blocked_plugin.cc index b3c0973..89e64a5 100644 --- a/chrome/renderer/blocked_plugin.cc +++ b/chrome/renderer/blocked_plugin.cc @@ -57,7 +57,7 @@ BlockedPlugin::BlockedPlugin(RenderView* render_view, values.SetString(L"updatePlugin", l10n_util::GetStringUTF16(IDS_PLUGIN_UPDATE)); values.SetString(L"message", - l10n_util::GetStringUTF16(IDS_BLOCKED_PLUGINS_TITLE)); + l10n_util::GetStringUTF16(IDS_BLOCKED_PLUGINS_MESSAGE)); if (group) values.Set(L"pluginGroup", group->GetDataForUI()); diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index 07595ea..234b056 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -560,10 +560,11 @@ WebPlugin* RenderView::CreatePluginNoCheck(WebFrame* frame, const WebPluginParams& params) { WebPluginInfo info; bool found; + ContentSetting setting; std::string mime_type; Send(new ViewHostMsg_GetPluginInfo( params.url, frame->top()->url(), params.mimeType.utf8(), &found, - &info, &mime_type)); + &info, &setting, &mime_type)); if (!found || !info.enabled) return NULL; scoped_refptr<pepper::PluginModule> pepper_module = @@ -2255,6 +2256,8 @@ void RenderView::runModal() { WebPlugin* RenderView::createPlugin(WebFrame* frame, const WebPluginParams& params) { bool found = false; + ContentSetting setting = CONTENT_SETTING_DEFAULT; + CommandLine* cmd = CommandLine::ForCurrentProcess(); WebPluginInfo info; GURL url(params.url); std::string actual_mime_type; @@ -2263,6 +2266,7 @@ WebPlugin* RenderView::createPlugin(WebFrame* frame, params.mimeType.utf8(), &found, &info, + &setting, &actual_mime_type)); if (!found) @@ -2272,8 +2276,7 @@ WebPlugin* RenderView::createPlugin(WebFrame* frame, group->AddPlugin(info, 0); if (!info.enabled) { - if (CommandLine::ForCurrentProcess()->HasSwitch( - switches::kDisableOutdatedPlugins) && + if (cmd->HasSwitch(switches::kDisableOutdatedPlugins) && group->IsVulnerable()) { Send(new ViewHostMsg_DisabledOutdatedPlugin(routing_id_, group->GetGroupName(), @@ -2284,10 +2287,13 @@ WebPlugin* RenderView::createPlugin(WebFrame* frame, } if (info.path.value() != kDefaultPluginLibraryName) { - if (!AllowContentType(CONTENT_SETTINGS_TYPE_PLUGINS)) { - DCHECK(CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableClickToPlay)); - didNotAllowPlugins(frame); + std::string resource; + if (cmd->HasSwitch(switches::kEnableResourceContentSettings)) { + resource = info.path.ToString(); + } + if (setting == CONTENT_SETTING_BLOCK) { + DCHECK(cmd->HasSwitch(switches::kEnableClickToPlay)); + DidBlockContentType(CONTENT_SETTINGS_TYPE_PLUGINS, resource); return CreatePluginPlaceholder(frame, params, NULL); } scoped_refptr<pepper::PluginModule> pepper_module = @@ -2295,8 +2301,10 @@ WebPlugin* RenderView::createPlugin(WebFrame* frame, if (pepper_module) return CreatePepperPlugin(frame, params, info.path, pepper_module.get()); if (CommandLine::ForCurrentProcess()->HasSwitch( - switches::kBlockNonSandboxedPlugins)) { + switches::kBlockNonSandboxedPlugins) && + setting != CONTENT_SETTING_ALLOW) { Send(new ViewHostMsg_NonSandboxedPluginBlocked(routing_id_, + resource, group->GetGroupName())); return CreatePluginPlaceholder(frame, params, NULL); } @@ -2439,7 +2447,7 @@ bool RenderView::allowImages(WebFrame* frame, bool enabled_per_settings) { if (IsWhitelistedForContentSettings(frame)) return true; - DidBlockContentType(CONTENT_SETTINGS_TYPE_IMAGES); + DidBlockContentType(CONTENT_SETTINGS_TYPE_IMAGES, std::string()); return false; // Other protocols fall through here. } @@ -3240,11 +3248,11 @@ bool RenderView::allowDatabase( return result; } void RenderView::didNotAllowScript(WebKit::WebFrame* frame) { - DidBlockContentType(CONTENT_SETTINGS_TYPE_JAVASCRIPT); + DidBlockContentType(CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string()); } void RenderView::didNotAllowPlugins(WebKit::WebFrame* frame) { - DidBlockContentType(CONTENT_SETTINGS_TYPE_PLUGINS); + DidBlockContentType(CONTENT_SETTINGS_TYPE_PLUGINS, std::string()); } void RenderView::didExhaustMemoryAvailableForScript(WebFrame* frame) { @@ -3795,10 +3803,12 @@ bool RenderView::AllowContentType(ContentSettingsType settings_type) { CONTENT_SETTING_BLOCK; } -void RenderView::DidBlockContentType(ContentSettingsType settings_type) { +void RenderView::DidBlockContentType(ContentSettingsType settings_type, + const std::string& resource_identifier) { if (!content_blocked_[settings_type]) { content_blocked_[settings_type] = true; - Send(new ViewHostMsg_ContentBlocked(routing_id_, settings_type)); + Send(new ViewHostMsg_ContentBlocked(routing_id_, settings_type, + resource_identifier)); } } diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index 53e3d6d..f2b0484 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -881,7 +881,8 @@ class RenderView : public RenderWidget, PluginGroup* group); // Sends an IPC notification that the specified content type was blocked. - void DidBlockContentType(ContentSettingsType settings_type); + void DidBlockContentType(ContentSettingsType settings_type, + const std::string& resource_identifier); // This callback is triggered when DownloadImage completes, either // succesfully or with a failure. See DownloadImage for more details. |