From 30672decaecab53419d8e96a32bfa69d4cb0c8ca Mon Sep 17 00:00:00 2001 From: "alqahira%ardisson.org" Date: Sun, 26 Apr 2009 06:09:09 +0000 Subject: [PATCH] Back out bug 475201 due to the Xcode 2.x ld suckage git-svn-id: svn://10.0.0.236/trunk@257057 18797224-902f-48f8-a5cc-f745e15eee43 --- .../camino/Camino.xcodeproj/project.pbxproj | 8 - .../PreferencePanes/WebFeatures/WebFeatures.h | 4 +- .../WebFeatures/WebFeatures.mm | 147 +++++-- .../BrowserWindow.nib/classes.nib | 366 ++++++++++-------- .../English.lproj/BrowserWindow.nib/info.nib | 13 +- .../BrowserWindow.nib/keyedobjects.nib | Bin 37193 -> 36633 bytes .../src/browser/BrowserWindowController.h | 2 - .../src/browser/BrowserWindowController.mm | 83 ---- mozilla/camino/src/browser/BrowserWrapper.mm | 126 +++++- .../src/browser/FlashblockWhitelistManager.h | 90 ----- .../src/browser/FlashblockWhitelistManager.mm | 256 ------------ .../src/preferences/GeckoPrefConstants.h | 3 - .../src/preferences/GeckoPrefConstants.mm | 1 - 13 files changed, 451 insertions(+), 648 deletions(-) delete mode 100644 mozilla/camino/src/browser/FlashblockWhitelistManager.h delete mode 100644 mozilla/camino/src/browser/FlashblockWhitelistManager.mm diff --git a/mozilla/camino/Camino.xcodeproj/project.pbxproj b/mozilla/camino/Camino.xcodeproj/project.pbxproj index 6d4df854c48..6557ceea6d8 100644 --- a/mozilla/camino/Camino.xcodeproj/project.pbxproj +++ b/mozilla/camino/Camino.xcodeproj/project.pbxproj @@ -995,8 +995,6 @@ B3128A120E5D14C8009F0595 /* pageBigger.tiff in Resources */ = {isa = PBXBuildFile; fileRef = B3757F860E5D0FE70006EDF1 /* pageBigger.tiff */; }; B3128A130E5D14CD009F0595 /* pageSmaller.tiff in Resources */ = {isa = PBXBuildFile; fileRef = B3757F870E5D0FE70006EDF1 /* pageSmaller.tiff */; }; B3128A140E5D14CE009F0595 /* pageSmaller.tiff in Resources */ = {isa = PBXBuildFile; fileRef = B3757F870E5D0FE70006EDF1 /* pageSmaller.tiff */; }; - B3886D880F79D53700D8E015 /* FlashblockWhitelistManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = B3886D870F79D53700D8E015 /* FlashblockWhitelistManager.mm */; }; - B3886D890F79D53700D8E015 /* FlashblockWhitelistManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = B3886D870F79D53700D8E015 /* FlashblockWhitelistManager.mm */; }; C713F0900E9AF7DB002313B3 /* CHSlidingViewAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = C713F08E0E9AF7DB002313B3 /* CHSlidingViewAnimation.m */; }; C713F0910E9AF7DB002313B3 /* CHSlidingViewAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = C713F08E0E9AF7DB002313B3 /* CHSlidingViewAnimation.m */; }; C79573880D35314D0028A773 /* XMLSearchPluginParser.mm in Sources */ = {isa = PBXBuildFile; fileRef = C79573840D35314D0028A773 /* XMLSearchPluginParser.mm */; }; @@ -2873,8 +2871,6 @@ A7FD31C90466004E00A80196 /* libsuitetypeaheadfind.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsuitetypeaheadfind.a; path = ../extensions/typeaheadfind/src/libsuitetypeaheadfind.a; sourceTree = SOURCE_ROOT; }; B3757F860E5D0FE70006EDF1 /* pageBigger.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = pageBigger.tiff; path = resources/images/toolbar/pageBigger.tiff; sourceTree = ""; }; B3757F870E5D0FE70006EDF1 /* pageSmaller.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = pageSmaller.tiff; path = resources/images/toolbar/pageSmaller.tiff; sourceTree = ""; }; - B3886D840F79D52700D8E015 /* FlashblockWhitelistManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FlashblockWhitelistManager.h; path = src/browser/FlashblockWhitelistManager.h; sourceTree = ""; }; - B3886D870F79D53700D8E015 /* FlashblockWhitelistManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FlashblockWhitelistManager.mm; path = src/browser/FlashblockWhitelistManager.mm; sourceTree = ""; }; C713F08E0E9AF7DB002313B3 /* CHSlidingViewAnimation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CHSlidingViewAnimation.m; path = src/extensions/CHSlidingViewAnimation.m; sourceTree = ""; }; C713F08F0E9AF7DB002313B3 /* CHSlidingViewAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CHSlidingViewAnimation.h; path = src/extensions/CHSlidingViewAnimation.h; sourceTree = ""; }; C79573840D35314D0028A773 /* XMLSearchPluginParser.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = XMLSearchPluginParser.mm; path = src/websearch/XMLSearchPluginParser.mm; sourceTree = ""; }; @@ -4029,8 +4025,6 @@ F6BA6D4E01B2F8A601A962F7 /* BrowserWrapper.mm */, F59E9F3D0237E28401A967DF /* ContentClickListener.h */, F59E9F3F0237E43401A967DF /* ContentClickListener.mm */, - B3886D870F79D53700D8E015 /* FlashblockWhitelistManager.mm */, - B3886D840F79D52700D8E015 /* FlashblockWhitelistManager.h */, ); name = Content; sourceTree = ""; @@ -6375,7 +6369,6 @@ C7DE8DD70F30CFAC00CD3872 /* SafeBrowsingListManager.mm in Sources */, C7DE8DD80F30CFAC00CD3872 /* SafeBrowsingAboutModule.mm in Sources */, 3DE5B63A0F6C11B300D2EF11 /* TransientBar.mm in Sources */, - B3886D880F79D53700D8E015 /* FlashblockWhitelistManager.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -6564,7 +6557,6 @@ C7DE8DD90F30CFAC00CD3872 /* SafeBrowsingListManager.mm in Sources */, C7DE8DDA0F30CFAC00CD3872 /* SafeBrowsingAboutModule.mm in Sources */, 3DE5B63B0F6C11B400D2EF11 /* TransientBar.mm in Sources */, - B3886D890F79D53700D8E015 /* FlashblockWhitelistManager.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/mozilla/camino/PreferencePanes/WebFeatures/WebFeatures.h b/mozilla/camino/PreferencePanes/WebFeatures/WebFeatures.h index 3f31c9ec8c4..f55d3d32e58 100644 --- a/mozilla/camino/PreferencePanes/WebFeatures/WebFeatures.h +++ b/mozilla/camino/PreferencePanes/WebFeatures/WebFeatures.h @@ -68,7 +68,8 @@ IBOutlet ExtendedTableView* mFlashblockWhitelistTable; IBOutlet NSTextField* mAddFlashblockField; IBOutlet NSButton* mAddFlashblockButton; - NSArray* mFlashblockSites; // STRONG + NSMutableArray* mFlashblockSites; // STRONG + NSCharacterSet* mFlashblockSiteCharSet; // STRONG NSMutableArray* mCachedPermissions; // cached list for speed, STRONG } @@ -98,7 +99,6 @@ -(IBAction) editFlashblockWhitelistDone:(id)aSender; -(IBAction) removeFlashblockWhitelistSite:(id)aSender; -(IBAction) addFlashblockWhitelistSite:(id)Sender; --(void) updateFlashblockWhitelist; // data source informal protocol (NSTableDataSource) - (int)numberOfRowsInTableView:(NSTableView *)aTableView; diff --git a/mozilla/camino/PreferencePanes/WebFeatures/WebFeatures.mm b/mozilla/camino/PreferencePanes/WebFeatures/WebFeatures.mm index e0660fb7baf..c180fe977e2 100644 --- a/mozilla/camino/PreferencePanes/WebFeatures/WebFeatures.mm +++ b/mozilla/camino/PreferencePanes/WebFeatures/WebFeatures.mm @@ -45,12 +45,11 @@ #import "CHPermissionManager.h" #import "ExtendedTableView.h" #import "GeckoPrefConstants.h" -#import "FlashblockWhitelistManager.h" // need to match the strings in PreferenceManager.mm static NSString* const AdBlockingChangedNotificationName = @"AdBlockingChanged"; static NSString* const kFlashBlockChangedNotificationName = @"FlashBlockChanged"; -static NSString* const kFlashblockWhitelistChangedNotificationName = @"FlashblockWhitelistChanged"; +static NSString* const kFlashBlockWhitelistChangedNotificationName = @"FlashBlockWhitelistChanged"; // for annoyance blocker prefs const int kAnnoyancePrefNone = 1; @@ -64,6 +63,9 @@ const int kAnnoyancePrefSome = 3; - (int)preventAnimationCheckboxState; - (BOOL)isFlashBlockAllowed; - (void)updateFlashBlock; +- (BOOL)isValidFlashblockSite:(NSString*)aSite; +- (void)populateFlashblockCache; +- (void)saveFlashblockWhitelist; - (void)populatePermissionCache; @end @@ -75,6 +77,7 @@ const int kAnnoyancePrefSome = 3; [[NSNotificationCenter defaultCenter] removeObserver:self]; [mFlashblockSites release]; + [mFlashblockSiteCharSet release]; [super dealloc]; } @@ -320,9 +323,46 @@ const int kAnnoyancePrefSome = 3; [mAddField setStringValue:@""]; } +// Flashblock Whitelist methods +- (void)populateFlashblockCache +{ + // Create the array to hold Flashblock sites + if (!mFlashblockSites) + mFlashblockSites = [[NSMutableArray alloc] init]; + else + [mFlashblockSites removeAllObjects]; + + // Always reload pref since user may have manually edited list + // The whitelist pref is a string with format: + // siteA.com,www.siteB.com,*.siteC.com + NSArray* whitelistArray = [[self getStringPref:"flashblock.whitelist" withSuccess:NULL] + componentsSeparatedByString:@","]; + + NSEnumerator* enumerator = [whitelistArray objectEnumerator]; + NSString* site; + while ((site = [enumerator nextObject])) { + site = [site stringByRemovingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + if ([self isValidFlashblockSite:site]) + [mFlashblockSites addObject:site]; + } + + // Write correctly formatted sites to prefs so that we stay in sync + if ([whitelistArray count] != [mFlashblockSites count]) + [self saveFlashblockWhitelist]; +} + +- (void)saveFlashblockWhitelist +{ + NSString* siteString = [mFlashblockSites componentsJoinedByString:@","]; + [self setPref:"flashblock.whitelist" toString:siteString]; + + // Send a notification that the whitelist settings have been changed + [[NSNotificationCenter defaultCenter] postNotificationName:kFlashBlockWhitelistChangedNotificationName object:nil]; +} + - (IBAction)editFlashblockWhitelist:(id)aSender { - [self updateFlashblockWhitelist]; + [self populateFlashblockCache]; [NSApp beginSheet:mFlashblockWhitelistPanel modalForWindow:[mEditFlashblockWhitelist window] // any old window accessor @@ -333,25 +373,19 @@ const int kAnnoyancePrefSome = 3; [mFlashblockWhitelistTable setDeleteAction:@selector(removeFlashblockWhitelistSite:)]; [mFlashblockWhitelistTable setTarget:self]; - [mAddFlashblockButton setEnabled:NO]; + [mAddButton setEnabled:NO]; [mAddFlashblockField setStringValue:@""]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(updateFlashblockWhitelist) - name:kFlashblockWhitelistChangedNotificationName - object:nil]; } - (IBAction)editFlashblockWhitelistDone:(id)aSender { + [mFlashblockSites removeAllObjects]; + + [mFlashblockSiteCharSet release]; + mFlashblockSiteCharSet = nil; + [mFlashblockWhitelistPanel orderOut:self]; [NSApp endSheet:mFlashblockWhitelistPanel]; - - [[NSNotificationCenter defaultCenter] removeObserver:self - name:kFlashblockWhitelistChangedNotificationName - object:nil]; - [mFlashblockSites release]; - mFlashblockSites = nil; } - (IBAction)removeFlashblockWhitelistSite:(id)aSender @@ -360,25 +394,34 @@ const int kAnnoyancePrefSome = 3; if (row < 0) return; - [[FlashblockWhitelistManager sharedInstance] removeFlashblockWhitelistSite:[mFlashblockSites objectAtIndex:row]]; + [mFlashblockSites removeObjectAtIndex:row]; + [self saveFlashblockWhitelist]; + [mFlashblockWhitelistTable reloadData]; } - (IBAction)addFlashblockWhitelistSite:(id)sender { - NSString* site = [mAddFlashblockField stringValue]; - [[FlashblockWhitelistManager sharedInstance] addFlashblockWhitelistSite:site]; - // The user can no longer add the site that's in the text field, - // so clear the text field and disable the Add button. - [mAddFlashblockField setStringValue:@""]; - [mAddFlashblockButton setEnabled:NO]; -} + NSString* site = [[mAddFlashblockField stringValue] stringByRemovingCharactersInSet: + [NSCharacterSet whitespaceAndNewlineCharacterSet]]; + + // Remove any protocol specifier (eg. "http://") + NSRange protocolRange = [site rangeOfString:@"://"]; + if (protocolRange.location != NSNotFound) + site = [site substringFromIndex:(protocolRange.location + protocolRange.length)]; + + // Only add a Flashblock whitelist site if it's properly formatted and not already added + if ([self isValidFlashblockSite:site] && ![mFlashblockSites containsObject:site]) { + [mFlashblockSites addObject:site]; + [self saveFlashblockWhitelist]; + [mFlashblockWhitelistTable reloadData]; + + [mAddFlashblockField setStringValue:@""]; + [mAddFlashblockButton setEnabled:NO]; + } + else { + NSBeep(); + } --(void) updateFlashblockWhitelist -{ - // Get the updated whitelist array. - [mFlashblockSites release]; - mFlashblockSites = [[[FlashblockWhitelistManager sharedInstance] whitelistArray] retain]; - [mFlashblockWhitelistTable reloadData]; } // data source informal protocol (NSTableDataSource) @@ -427,8 +470,8 @@ const int kAnnoyancePrefSome = 3; if (textField == mAddField) [mAddButton setEnabled:[[mAddField stringValue] length] > 0]; - else if (textField == mAddFlashblockField) - [mAddFlashblockButton setEnabled:[[FlashblockWhitelistManager sharedInstance] canAddToWhitelist:[mAddFlashblockField stringValue]]]; + else // textField == mAddFlashblockField + [mAddFlashblockButton setEnabled:[[mAddFlashblockField stringValue] length] > 0]; } // @@ -567,4 +610,46 @@ const int kAnnoyancePrefSome = 3; [[NSNotificationCenter defaultCenter] postNotificationName:kFlashBlockChangedNotificationName object:nil]; } +// +// isValidFlashblockSite +// +// Returns true if string contains a valid site (*.site.com or site.com) +// +- (BOOL)isValidFlashblockSite:(NSString*)aSite +{ + if ([aSite length] == 0) + return NO; + + // Reuse character string for hostname validation since it's expensive to make. + if (!mFlashblockSiteCharSet) { + NSMutableCharacterSet* charSet = [[[NSCharacterSet alphanumericCharacterSet] mutableCopy] autorelease]; + [charSet addCharactersInString:@"-_"]; + mFlashblockSiteCharSet = [charSet copy]; + } + + // Site may begin with '*.', in which case drop the first 2 characters. + if ([aSite rangeOfString:@"*."].location == 0) + aSite = [aSite substringFromIndex:2]; + + // Split string on '.' and check components for valid string. + NSArray* subdomains = [aSite componentsSeparatedByString:@"."]; + + // There must be at least two components (eg. something.com) + if ([subdomains count] < 2) + return NO; + + NSEnumerator* enumerator = [subdomains objectEnumerator]; + NSString* subdomain; + while ((subdomain = [enumerator nextObject])) { + if ([subdomain length] == 0) + return NO; + NSScanner* scanner = [NSScanner scannerWithString:subdomain]; + [scanner scanCharactersFromSet:mFlashblockSiteCharSet intoString:NULL]; + if (![scanner isAtEnd]) + return NO; + } + + return YES; +} + @end diff --git a/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/classes.nib b/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/classes.nib index bdcf4befb02..e23408fd998 100644 --- a/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/classes.nib +++ b/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/classes.nib @@ -1,164 +1,206 @@ { - IBClasses = ( - { - CLASS = AutoCompleteTextField; - LANGUAGE = ObjC; - OUTLETS = {mLockIconContextMenu = NSMenu; mProxyIcon = PageProxyIcon; }; - SUPERCLASS = NSTextField; - }, - { - ACTIONS = {addFolder = id; }; - CLASS = BookmarkToolbar; - LANGUAGE = ObjC; - SUPERCLASS = NSView; - }, - { - CLASS = BrowserContainerView; - LANGUAGE = ObjC; - OUTLETS = {mTabBarView = BrowserTabBarView; mTabView = BrowserTabView; }; - SUPERCLASS = NSView; - }, - { - ACTIONS = {toggleBookmarkManager = id; }; - CLASS = BrowserContentView; - LANGUAGE = ObjC; - OUTLETS = { - mBookmarkManagerView = NSView; - mBookmarksToolbar = BookmarkToolbar; - mBrowserContainerView = NSView; - mStatusBar = NSView; - }; - SUPERCLASS = NSView; - }, - { - CLASS = BrowserTabBarView; - LANGUAGE = ObjC; - OUTLETS = {mTabView = BrowserTabView; }; - SUPERCLASS = NSView; - }, - { - CLASS = BrowserTabView; - LANGUAGE = ObjC; - OUTLETS = {mTabBar = BrowserTabBarView; }; - SUPERCLASS = NSTabView; - }, - {CLASS = BrowserTabViewItem; LANGUAGE = ObjC; SUPERCLASS = IconTabViewItem; }, - {CLASS = BrowserWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; }, - { - ACTIONS = { - addBookmark = id; - addBookmarkFolder = id; - addBookmarkForLink = id; - addBookmarkSeparator = id; - addBookmarkWithoutPrompt = id; - addTabGroup = id; - addTabGroupWithoutPrompt = id; - addToAddressBook = id; - back = id; - cancelLocationSheet = id; - cancelSearchSheet = id; - closeCurrentTab = id; - closeOtherTabs = id; - closeSendersTab = id; - copyAddressToClipboard = id; - copyImage = id; - copyImageLocation = id; - copyLinkLocation = id; - endLocationSheet = id; - endSearchSheet = id; - findSearchEngines = id; - forward = id; - frameToNewTab = id; - frameToNewWindow = id; - frameToThisWindow = id; - getInfo = id; - goToLocationFromToolbarURLField = id; - home = id; - makePageBigger = id; - makePageDefaultSize = id; - makePageSmaller = id; - makeTextBigger = id; - makeTextDefaultSize = id; - makeTextSmaller = id; - manageBookmarks = id; - manageHistory = id; - manageSearchEngines = id; - moveTabToNewWindow = id; - newTab = id; - nextTab = id; - openFeedPrefPane = id; - openLinkInNewTab = id; - openLinkInNewWindow = id; - pageSetup = id; - previousTab = id; - printDocument = id; - reload = id; - reloadAllTabs = id; - reloadSendersTab = id; - reloadWithNewCharset = id; - saveFrameAs = id; - saveImageAs = id; - saveLinkAs = id; - savePageAs = id; - searchFieldTriggered = id; - searchForSelection = id; - sendURL = id; - sendURLFromLink = id; - showBookmarksInfo = id; - showPageInfo = id; - showSiteCertificate = id; - stop = id; - toggleStatusBar = id; - toggleTabThumbnailView = id; - unblockFlashFromCurrentDomain = id; - viewOnlyThisImage = id; - viewPageSource = id; - viewSource = id; - }; - CLASS = BrowserWindowController; - LANGUAGE = ObjC; - OUTLETS = { - mBackItem = NSMenuItem; - mContentView = BrowserContentView; - mCopyItem = NSMenuItem; - mForwardItem = NSMenuItem; - mImageLinkMenu = NSMenu; - mImageMailToLinkMenu = NSMenu; - mImageMenu = NSMenu; - mInputMenu = NSMenu; - mLinkMenu = NSMenu; - mLocationSheetURLField = NSTextField; - mLocationSheetWindow = NSWindow; - mLocationToolbarView = ExtendedSplitView; - mMailToLinkMenu = NSMenu; - mPageMenu = NSMenu; - mPersonalToolbar = BookmarkToolbar; - mProgress = NSProgressIndicator; - mSearchBar = WebSearchField; - mSearchSheetTextField = WebSearchField; - mSearchSheetWindow = NSWindow; - mStatus = NSTextField; - mStatusBar = NSView; - mTabBarMenu = NSMenu; - mTabBrowser = BrowserTabView; - mTabMenu = NSMenu; - mURLBar = AutoCompleteTextField; - }; - SUPERCLASS = NSWindowController; - }, - {CLASS = ExtendedSplitView; LANGUAGE = ObjC; SUPERCLASS = NSSplitView; }, - { - ACTIONS = {addBookmark = id; addBookmarkFolder = id; addBookmarkSeparator = id; }; - CLASS = FirstResponder; - LANGUAGE = ObjC; - SUPERCLASS = NSObject; - }, - {CLASS = IconTabViewItem; LANGUAGE = ObjC; SUPERCLASS = NSTabViewItem; }, - {CLASS = NSObject; LANGUAGE = ObjC; }, - {CLASS = PageProxyIcon; LANGUAGE = ObjC; SUPERCLASS = NSImageView; }, - {CLASS = StatusBarView; LANGUAGE = ObjC; SUPERCLASS = NSView; }, - {CLASS = ThrobberHandler; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, - {CLASS = WebSearchField; LANGUAGE = ObjC; SUPERCLASS = NSSearchField; } - ); - IBVersion = 1; + IBClasses = ( + { + CLASS = AutoCompleteTextField; + LANGUAGE = ObjC; + OUTLETS = { + mLockIconContextMenu = NSMenu; + mProxyIcon = PageProxyIcon; + }; + SUPERCLASS = NSTextField; + }, + { + ACTIONS = { + addFolder = id; + }; + CLASS = BookmarkToolbar; + LANGUAGE = ObjC; + SUPERCLASS = NSView; + }, + { + CLASS = BrowserContainerView; + LANGUAGE = ObjC; + OUTLETS = { + mTabBarView = BrowserTabBarView; + mTabView = BrowserTabView; + }; + SUPERCLASS = NSView; + }, + { + ACTIONS = { + toggleBookmarkManager = id; + }; + CLASS = BrowserContentView; + LANGUAGE = ObjC; + OUTLETS = { + mBookmarkManagerView = NSView; + mBookmarksToolbar = BookmarkToolbar; + mBrowserContainerView = NSView; + mStatusBar = NSView; + }; + SUPERCLASS = NSView; + }, + { + CLASS = BrowserTabBarView; + LANGUAGE = ObjC; + OUTLETS = { + mTabView = BrowserTabView; + }; + SUPERCLASS = NSView; + }, + { + CLASS = BrowserTabView; + LANGUAGE = ObjC; + OUTLETS = { + mTabBar = BrowserTabBarView; + }; + SUPERCLASS = NSTabView; + }, + { + CLASS = BrowserTabViewItem; + LANGUAGE = ObjC; + SUPERCLASS = IconTabViewItem; + }, + { + CLASS = BrowserWindow; + LANGUAGE = ObjC; + SUPERCLASS = NSWindow; + }, + { + ACTIONS = { + addBookmark = id; + addBookmarkFolder = id; + addBookmarkForLink = id; + addBookmarkSeparator = id; + addBookmarkWithoutPrompt = id; + addTabGroup = id; + addTabGroupWithoutPrompt = id; + addToAddressBook = id; + back = id; + cancelLocationSheet = id; + cancelSearchSheet = id; + closeCurrentTab = id; + closeOtherTabs = id; + closeSendersTab = id; + copyAddressToClipboard = id; + copyImage = id; + copyImageLocation = id; + copyLinkLocation = id; + endLocationSheet = id; + endSearchSheet = id; + forward = id; + frameToNewTab = id; + frameToNewWindow = id; + frameToThisWindow = id; + getInfo = id; + goToLocationFromToolbarURLField = id; + home = id; + makeTextBigger = id; + makeTextDefaultSize = id; + makeTextSmaller = id; + manageBookmarks = id; + manageHistory = id; + moveTabToNewWindow = id; + newTab = id; + nextTab = id; + openFeedPrefPane = id; + openLinkInNewTab = id; + openLinkInNewWindow = id; + pageSetup = id; + previousTab = id; + printDocument = id; + reload = id; + reloadAllTabs = id; + reloadSendersTab = id; + reloadWithNewCharset = id; + saveFrameAs = id; + saveImageAs = id; + saveLinkAs = id; + savePageAs = id; + searchFieldTriggered = id; + searchForSelection = id; + sendURL = id; + sendURLFromLink = id; + showBookmarksInfo = id; + showPageInfo = id; + showSiteCertificate = id; + stop = id; + toggleStatusBar = id; + viewOnlyThisImage = id; + viewPageSource = id; + viewSource = id; + }; + CLASS = BrowserWindowController; + LANGUAGE = ObjC; + OUTLETS = { + mBackItem = NSMenuItem; + mContentView = BrowserContentView; + mCopyItem = NSMenuItem; + mForwardItem = NSMenuItem; + mImageLinkMenu = NSMenu; + mImageMailToLinkMenu = NSMenu; + mImageMenu = NSMenu; + mInputMenu = NSMenu; + mLinkMenu = NSMenu; + mLocationSheetURLField = NSTextField; + mLocationSheetWindow = NSWindow; + mLocationToolbarView = ExtendedSplitView; + mMailToLinkMenu = NSMenu; + mPageMenu = NSMenu; + mPersonalToolbar = BookmarkToolbar; + mProgress = NSProgressIndicator; + mProxyIcon = PageProxyIcon; + mSearchBar = NSSearchField; + mSearchSheetTextField = NSSearchField; + mSearchSheetWindow = NSWindow; + mStatus = NSTextField; + mStatusBar = NSView; + mTabBarMenu = NSMenu; + mTabBrowser = BrowserTabView; + mTabMenu = NSMenu; + mURLBar = AutoCompleteTextField; + }; + SUPERCLASS = NSWindowController; + }, + { + CLASS = ExtendedSplitView; + LANGUAGE = ObjC; + SUPERCLASS = NSSplitView; + }, + { + ACTIONS = { + addBookmark = id; + addBookmarkFolder = id; + addBookmarkSeparator = id; + }; + CLASS = FirstResponder; + LANGUAGE = ObjC; + SUPERCLASS = NSObject; + }, + { + CLASS = IconTabViewItem; + LANGUAGE = ObjC; + SUPERCLASS = NSTabViewItem; + }, + { + CLASS = NSObject; + LANGUAGE = ObjC; + }, + { + CLASS = PageProxyIcon; + LANGUAGE = ObjC; + SUPERCLASS = NSImageView; + }, + { + CLASS = StatusBarView; + LANGUAGE = ObjC; + SUPERCLASS = NSView; + }, + { + CLASS = WebSearchField; + LANGUAGE = ObjC; + SUPERCLASS = NSSearchField; + } + ); + IBVersion = 1; } \ No newline at end of file diff --git a/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/info.nib b/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/info.nib index a33814b232b..37023e7a2d9 100644 --- a/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/info.nib +++ b/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/info.nib @@ -1,24 +1,19 @@ - + IBDocumentLocation - 111 74 356 240 0 0 1440 878 - IBEditorPositions - - 297 - 526 315 226 424 0 0 1280 778 - + 95 62 356 240 0 0 1280 778 IBFramework Version 489.0 IBOldestOS - 4 + 5 IBOpenObjects 10 IBSystem Version - 8S2167 + 9F33 targetFramework IBCocoaFramework diff --git a/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/keyedobjects.nib b/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/keyedobjects.nib index 0e89215814381fd63534778bdfa4349ff19b8bb3..fc1a4022765041500e1510cf86a444e909cbff52 100644 GIT binary patch literal 36633 zcmdSC2Y3`!+c12}Y-4t2cT!2;6w(v2=>?JAdqOWUBnt$REF__W%%LMHAVoz{q=|^4 zG{J&cz=8-WDu{@n*io^eNcrwFvzu%nKCj>NU)THp|5M2B&MEh~dpYOK=!sR8b@dq; zClE#iQ6wM(G9n9VF(ht^tG2GvT~iWQ@18g`uB^6vTqXQ8B+fm0ysNyv&JW>*>)%5r zWFFbQL%RNBMOl5Bic9UbKE*v<(_IzqJ)L$abQ2Ph6**B3%0+F^ZKyr!j9x`=qmR*f z^ac77T|nQW@6eCv7fi4Px4J(f=Dn4C#^_4Ng$~ti)51=Qb2vfTeTBYCU!$+nL-a6xgT6;Uq#w~wJY%1xpVD*mJpG#fNPnfj(ckG6K@bdrQIG^b zAykMGl7wU-Q@Bm&B6Nk%J<&HpZ*pE3Bn%ctQ=3pJOcd&Ax-d(aE!-*06Xpv`gyq5t z;XdJh;Zb3euvyq5JSjXQJS#jeydu0R92HIor-e_2FN80J?}Z{iN@B(45QPSYs@pYF}62$Fm^R|Gxj$2F%}z#7)Kb(jTOd9<3!_R;}qjm<1FJm z<6`3y<6XvO#^uJ<#)pmTjE@*M8n+s^8+RFZ8}}HWH@;vzXne!?rtvM~yT%WUCyb|z zXN+GOFBrcvesBE2c**#u@tR368B9i#XtJ9WQ;;dl6mE((#h4OIiKaADwyD5WXu93h z-PF%C*mQ?!tf|K2Hr1P^o9;BtGc7hPGc7l*Fs(7&Z+h6Y!StkQyXjfeUef{7%cg^- zL#DS)$4tjfADTWgoi=@Lx?uXw^poi~)94Pw_ADiukv9l?)NDiPyy&R%FFiVx?BW zYOoruCac+Mv9_>^R;yLA%2u1zZdI&)R)1@NHP9Ml4YszlhFC+bVb*YKgf-F{Wp!Ai ztufYEYn-)}HQt(FO|&LildUP%RBM_w-P+okVRc$Fty$J=YmPP7nrF?o7FY|dMbvIE{T(m$;ajQ8Lfz7}TeDfZJU^D6YJ!tgdckpW?o{fd>m-r<<)%KGVjD=R$Dpl?TaO$~Sl;5XC_?^E2TtlCw_$AQmXYT?UN zckKk;N*|Fw83yyg0Q@67&^r9nM4qwTwY+5)cTIiovYN87uG&(&y-)F=N`R-zHMp{- z!aY@o+p`YuaKX*M&8Hm-)4HbB0~8~4So97mVRR!S@r-O^bc1SUBuzCi@&qGKGLp{d zdKIZgMp7AlOc53`vi*G^M<&Wb*|1n`fqXHlpwd!%aEDp|%2lgF2kWS>byronYTrkB zC?6G|!XY~HU3J6s4>izr11dyCqhPGbb@lFQeKAA4)PXg3@6gd*?k;Pa^*}vQ zFVq|LL48p_)E^B%#i#@gM1#;^Gz1Mr!_aUv0*yqYP${|tm7&q79919}8iU57ai|iF zM-xyLszx=)jV7W=s20_sdNdhLK~vE*G#$-AGtn$G8{LWKAQdq*7tKTS(E_v(EkcXY z5_A_@ita}DpnK6Wv>dHK_o0<&6(C?UQM4XChBly$XcO9u zwxGw+R`dkghMq**(NpMYv;#eZo<%#+F0>o%L3`12Xdl{-o<}dB7tu@T0D2i6M6ak8 z)lYS(t<;ffnd(w&)h+4?^&|DP`j`5*dV^ts;Q)q{8BSxkHN))~?!a&thPyG`gW+Bb z_hGmn!zBz4Vt6paLm3{<@JNP7Gdz~zDu!zqu4TB6;d+LrF+79eI~ktCFk^Tw!wVT+ z%MM46kMQVTLy`yqV!G3_s5BR))7T{4~Qm8Q#V4a}4ie zct680F#Hn32N-^t;e!mn!tkpMzs~TR48O(jQHI}T_yVE99ZKVtYK!>1WO%kbw6 zpJVtu!(TFdk>Q^h{*~cB7{1K#pA27N_$tHK89|Jg7_l%SG9oczV?<%Zj}d=H0vQQn zB$$y9Mxq#TFcQs33?s3O#GL@vd=0&h4xz*74bVw%fdF@M)zw$llyOx7TwUy*TwCrM z+^4u#*=Sdls;DhgqS`-3N1*3B=qL!*yXY7?j^0D>qYuyt^dUN~=_W3@16*|z-8B^; zULGw2<4x&ORW_EZozBzhT{S$8fzQR0C%S5_H$ zCos>a=nVP{orRe`0f8!>JeqfGP-MlGGhAvsjFMpYQ-`U;VVw9t!R?+rLou2!X!Qgi{xH{um%` zSQ^NCbw3Em+%;uYoL(X{PZjO4gHS(K$p><=r42y{f(}oYv?+fnDcG zlPjn6c31Q+tD6A00VS&a0z~ay~3G!pur~_0 zz=5MT;%J?QfnIWP6VX659|6K~C<@1eghYdc#5F@Zoa95hG(dE$8l<5&=EDZ`w)P-6 z3uklwaJQda?{?L2qtJj}e8E!Ep{#tu&}#lKN4*aaAc;}92!Id)h!H0|VtNv#;I{a7 z+zw1*hB`qV?=dX6qw3s<-oTx47qx|&sCLsO?j6Ksu0gVK58M;?!o9g{YXaIuO|oaI zUAc&Q2O6L{H{fDiq9&^yKjX9FL3l8F2M@tR^}+BkbPNy2BVevkxD?-k%kXGijw{d^ z?84dbYc{Tg6_=Ea<`Skc6fkOut}aUL{=l@gm199KRW+D!;6d(eXw2WKwrpx0$H&-O z_vD(2QhN|M6;)O4sU@|OYs!J*6`KA6{{!e)3^Xo>pL`~R#ow-G`I!+is+nr4+D=VV zQ!HwtMa>@N@ew?&IaE53-nG}L&d0D@P1mt~3f5T+*sjCHfQ$^awVFI^W?ptysw3N( zGh64Ysp!j%x?a)0PscMh;u(0R=2m!|fcCYuWz#`Cw7;4LbAsB+;|i={G#HM%7G3Zh z4nn1x4P1xk;vwiuNWRPi3LXMvFTe}28$eou@4`z#>^j!Tv z1z@qj%fnmoybXY?BK_Mo{Nx7wr0(BwXSjH3*+ei-AY%9_P=HV49rzjiEZzys$4w0^ zXN+di)DE%j;*s_rwY_2uAJJ=ad1Xae*V-~LfcnsT@X!q)4n-e%q*4vSYFEL2FscAm!cdG3pR?sIQd2!=?Nvepl_G7JFO( zd>kFc?*Y$u!5`og_(S{=NOBjzPDfW&6);CQE&+$2Y9)AIBdja&sQTz@5mNNs4s^MFc`bL4*hz@$3 zuM^mt#}43BOmx@QbFR@DgQJQwmv@Lv7_S7}6s@nHpj>aK_6Gsz4Z`2U5497J+GkWJ zclqRM7_iV$;jVEt<=2bAuRr2P)wXIswXezzl!pTw2KD8_U)8o9GCVBzJN{!6{sUhI z9dvvLERaJ1{0LJ!Oq{hGKtn(MXvISqkf8(pV+VDWGbr}IRu%SP!+p}7aD#zD> zJ~z-Yf^Zi?2qgkB5F>mxbE{W2O^d0Z*ThNYIp6>1|MxCH`kLvvulhyO#eM6GXq%LtD`(5*Qi_V^QF-${)D1P zC+4pL2y}%+`5I>u2LV_~*;p{rrCuX#2dkp+SsYqq=g>Xl;Zxuj z{bOO{jE6}Q%$Wjqcr?se(Tp=d(tYQHdCI->4DRBtomy5~F{0Y@;U*JL@?hu!7@;pt2tE zdPJhQyw>Ha830C6qldOW?s?ReO>ucNuijqsHi26PmuTDqvgL`KxvFd!l@A1sfV;Sg z)NFv>jLR!n3QczPUyAFeSGl;m%G+1g@bxty10Kj82>eKIu4htXc#7 zW4Ec*Y9*vRX3k7=W`S*W=4+NwbL}~M%pU1ceEKvVb47-z`6YaCkKH80!ESP=1{5V| z&{Ri3LwukO;#I;K{AXuoJ~zO55I78*nd#({W)=V+hR)1N&(6rq&vd0^<%14x{4#sw zXy5dLE-vMyVgsr0__I26C9dj;Rp6rxnyMv9eA#Fm(0V-3x(;Z)`BM+AZ=p1)0!r5q zH_&+^nM7)V&UK`oOjf4>`ZlPO)hTMdy2)-)H>zMPTEbGDnP4JvbNRZma=HHHI2)vc z12*jztm(eZNeINilO%VNIhrRqU46`p$+@a?6PZWmlLcgxG^WFklv{(#&? zmXf=1HmL&G2B)ElVm%2N;hQWY5Y0aK~|7wKn{13 zT>$tVvKRiHPxh1N$qSmqwXdpo)k4he^5`${Q~mlBLtI(u29?+yY+CJSt7tne;%3H-ZoP{*>Ga#vOVuv5A} z2C<6n%VdJJtiq$nC*(Bwl$-(jpVip)cJ*HM9(9?5kwv{*oi+;CN=J=mh5@ZU-!#pU z3Hl;eBpo43Mt4dR|+7Nmh-ytBZ22EXA zJ-Hh6Hus(U0w#egv|e4KF4yq2)Z%AH0xWu^{f647i4R2n!t2Nt%?G+qUBP`I|9U=W zLm+muGfr-R8{|ZvQmi3@OA42hvs_9j0Xg}U3gj7Tq$YHYTF62wQWLdO2^goOtahxc z9zN*Kk-7{D-5~n&?LF;~tWZ~}OBK9aUF~P?1Uy@(p#s1u)jw$@($`+tWOAzDGtEvO zNQ1P=gK5iBdn}*TH?;c=cg*-N^PsAQe|$ zTRD-Z;!5pFH^I=krrcctrThi}G*_-<`b5{Da*eY!0i-E3bt6rsY24yK6zvJdI#p^O zW?AiY?(sEzxd~x9zv;;knn9hLsk6~-g_M(y&<4kKSfee0k6M;3JCl2AO)aET|FK%{ zT|Ca^s@Ls}kKv>FD2f(>;d>km-v|F__-Gr_jkeVdA8k)NaKlGC(oX6&Fnq@~!?#s^ zUwuz~LNj}r1t5mG8QENuWascKAUAtH&Owue3GGRHX=d)2`lOeNeN{k0KiZ!TpvAOA z-LCFZpHp8_4>qGiXd66=4xvNoFghG((~-0dKy|yiLw#C(M!_vC>Qm}AP!rtG>gWas z01{>mZv0K^Bb$f*Tz#CnDMT8E&(YEN3teRZT;pJ(@tWpdHR*bLFpIhbZ&$eZKHEfe zF@!I)#uL8mREvgk!PUg|Cfy9{_<+{a$=qyfYZ##JR`*!cZMVd0x^1R2$!gl4+h)xy z?*(1Ei(6#>u5L%Yn;T;XWFfWua^Wpgk;mvfI-i>XZK?(8K6O7#rQsth2b`Aw!s61U zWDmUufEqyd)8*s^O-x?^bN4)e_MD$NAE5zV-Ax<>x{9t=JE$+(?L)h{s;0Q=AueeS z*0uB@A6O5lFMDCl%mr8Qzk^jXS+uwbth&j1>9p5U(XIG6eL{=8!CGmYww*o&NZUc5 zq0hqKU9=6vcbzLL>v`@FTxy8w#&X?Ir!nE%>Z=y@i29m>1&jKMx@}}XNC!h0Hf?(M zaxEjTr-U0k<=g3g)wG2^PhX%f(wFD~`m*}EdPqI2zM;OUz6E}G`-#B7j((lGI3|`s zGG??J0vJa<%-8s=PuE+YIs3SVlsG_>l})Uh%w6CLM?ZI6J;WoR^&C^2>6y3ofdpQc zN^or;BUINZ7@(rs6gKVgLIU>OZw4c^f>5m&9w47T~+1S8veZ;{4T(K`a|G#h_L{99r#-yc;zy#LDyn{Ys0KKUP0!CUT|UHb$=W zB1EpIJdx{3K8jD3fd0~uvnH_jEU348ipv36KduG(Kp3qneNYV5@Bn@wczw zu3lEpsAnw@e0JugCorAGu*a^Rhl7CVhR?c~dxw7)3i9s>7Sc~>fj$(hU=E`n~#t`l+`&cm^AU z2q9AaLjB6KJno62Q;=5!=@#s;yrDv@5GS+($sQ@#VV>K;id;}|q537aBj<)fKng(! zn27&iA#k}6p<4)#VQ8m*0aoE3lnS3#$l*#w$QKH9rQ(_T8?HURRlnw{tJI6?FHJi8`l7y_g=*aw72LF?r}J;%W&Yu1pjvP(g*x^32G>%UB1~`2r5rjl zi+eqQ0AE$%t$l(ZH0puF;7tq==7QL52M_1U@EY(AAh6`p(%1-;g|J9itSO7D>h)$5 zYr@h-b%E1J94L%y9)%GD)ag6XRpUvhRn}-~0W`s=F?>&orVrqok22sBt`^qt2^mHV zQ(Zqb6i9g{Pk7K5!SEJdnuO*3XAEz>3B#V|O={M{ zM>j(+H9$X1gI+^#bL;->=AO2Oo?tf``!;x#%?uy2GxR zGT0^Ka>Q$m>3a1V5jVmO-NScY3M9M5oK zvm$0N`>gPiLE;S3(!0h$`*_&rq=^}a+~JWj-Oe^YoO0`Mp$)?UHf|XVgcLGgJgMH4 z^SC$~LT=(c4}jr~JQmpB(G1-TvA$sNHAVUW;inN_Tanl0X>N>^o5yf8jN!HiqE4_2 zYAWo7s)D~|uusYXd#ftp`vmw@0>9L9en9n(_~ypWx_RsvpRxT>2N=^0BXO>(^^C}O zVAVCw()_qZH;)_VGp-%B=kpOO0cH;4EhGLTAwVlORRWhZW$YvCfz7i+FJE|gABGbe zAcDC1Ru%pqn9J832s#8Fa{$6KwE9-z0+nwVsoNNaQ~rgKF}Qq<48y56NuyzWqcp2H!LtLG>l}}$#5paSqx`0oWpP~!+8wnGhD!MA;U!s zw_*4;hTFo5o2QA7#2Z{UNqlPaU3{e4+oeIOQ~!}`ZWdo}S0C|BZB96RgxBC|BD~Eu z_mNY*d4rrb+uTR=^yUqs*KBhiiPD=lNL1>-w3xh`uUYg=^AC=P!F7{aYz``4v#3MW zU>2Kg?qdt}<_)&6+2%f0PjB8}_5PXIH>(JbDEX*}f8Z@26`}X>Q4y)5bnDryXbZay zzw06gZcuwLROR5!c$}FMcgL#AiCTp3BY9j-uNeN;J9T8ZbMxGOy-{i5G$Z94*hyDf zYK+}g?PK@*fi~q@-T_CS>KyUIdC`-nL)zChofXF!Tku&`Fvwj8j)oMs&-25$7 z!Cg*P6B+J4q#A5uQ)l@wE`cUN(4-@8(sMX(;wfx5QA4!Y7_Lq962ra0-0Im}ua(mR zd!L!POT6D0qvONQaNiMp0h+%8E8rOiZC9Z&-k6|*H_@Nr;%4O4nCycu%&|4VgROvp z{dh)ake1i+nU^o8*qEa&Cz;`agFVY>T*_gxkj&RYh^0^uywdo9gS^k!P6ruW-XY*^ zbGmCld)MhZ743(jj9s)?1a$2%$R#w*b8sEacTY5(;)b!8J_W311cd#33eJSh&0yp+ z4B+Z~6j$eEd?cS#hH-GC%_#M#dgCw%yNtsbzM~m@`g-ifejJ|-9{VUL$yNW8D+#DE zjx~$8ZdMr@U-g+; z3&9zl<(WIC#zz%)0Y|kA+{*@KsOb`YJIGDAAqzdYS=tmg_$Yw=K7ieWgRKs();I7p z0ogFmEBxT;3~9vQY2&9HfAbh#&>a5G`mTbLmX~w+_T-on9t;fR^4$c3ozZdQcK}MF z3eoi9LDp=dg-9a ze8O`khdv*qHdYU7Q1L#K0KkG`is!9VINoqStlXzyTLN2t;T(~xqG=CPig$?*!V;Uo zt>EMQ2Gsfcml; zTtHqIY(DC-gCc6gX4htf220&Y`@$87>% zu6q;Wn7Vnxz76X2#wUk)?Nw91yz+Xb@d5CXsgqZ;0P2S{eYDWDNGJ6Z3_sZnc1?FR z3ZyRC+dTT^%OP2j~mZAa0x`lcBx zt|ts$>?ZnRmm_hvX^)Pn-3;&5G1Vl{G41naSaF)^B`#ijyqefvIcR{Z%3W45xK{h) zBe-DU1;t}DK-7Kp2^4rPd!BsS{(Msc^!$Ks`lq=$#5QLer_}0MoA;(9bda8fYJ2Dz9_ejGJ%z)AW~)i9-y(0lZ=Q8$|wh^qV)) z%hPQ*+jJdWgAH6-qL*GYy`-gj8@7q55f+9I!+uHxZ8Yl%j*(5LnFCHtXnxTsop|u| zCZ`CN1Bq)-{vC`eZ7|+u$t-i@{WinzG$UMQpX>vMvo8!E@v_V?{Wu1nd{~`!G6O!{ zM6KCg9)M)Y^G&d8c9^4eq#R@Ty=FC;Ij&K#y|LhN@9ZGZTGn54i}iiHfDfMg=fB*t zv6u7546n_A6wX6UfH8G7XY0U#!ao57ZLDM5QrF}o&GJSlkOqRoIzFi=b6YR1KL%Pi zyDXq{!%;BfTwM-Xk>5WXgJMW3>syw7f1Fn;465{ zvb$C%7i>vtN+a_S^H6;b5aG|7V}TLAGjJ9-R{)W9le|zhn4&_3A&`{F{?@Izbt3NZP3}|I)N@S#2~e|J&XE zae+5GHJ-v^L!wHJX_m=-eHy(>gHNNzz-|bT_*?8GnQuPA`9Ph+@QfhsCiGYLE9&IHDA*8_h0`)e{0}-^>;uc z2CnMy8~88(WBjHK;f>$41DOIPezT|58}A-7t+jc(NJS$&%`Iow#WRB}fDh8=M^GF~VSS|I7Kbq~k4|AVgTS zR2z6E#9V53jCDf|)3X7OS2jFY_2$rg)GF{GF0nw~jq_kfMp~3qH}T%VgjvEZdXfzg zMyxE@;2IWCD$fq;x{OqSm z&`Yp4;)>4$<7pUm8b{YWK5WaOa2yG;noUpWVhoM$gsB5~n@BG=GS&HnWv=;{WxjEn z`KmD<{cKrczQjlv*C-@h%PN6j^;h9UKbX$H{!umFqWiIB6*snxx<9}^_Fpm>PgD75 z|A7Cp8-#u}6DQvqf{=xt$RAQ9_xs=xr24o=szC?b@O@H(-q29r5%hyE>UkWgJ%IDa zO&-AMW<6MJ0g1GxJxHGA5YQnR@{Obwa9U+eWqoB?RhP=zy2h&uH2PTHw7kVg$`1Q< zgFyQkMnYK+p*JACJr2KXxYIaRh_r;8C4<2{M6erX2{%X*Spd6d_6V1Ze+!EFDlIX_ z<4Q75ScE%UBF&c!SMX6YGt4kMgsZ?0p9uRba}5iOD}`&upKzLGiD{vMT5izG1{cl8 zZo?dU!7!KPnU@>p30pafn7V<}&=!-?=AgL(A2O2ZVb3WTFDf~)FovD_mJRO0q89J2-H&5ZQ3ph z`1KHMw*gzRi$`hTU_oZ)6li;pDZbqToGu8uA+m!)Y^7#iAB0M+nhbdy^(FARxCa0Z z*gP$r(-zJzozCoOv6nH%_Va1Zyj=&N&|a0zJbg6iTWbevSdN&hYe7o-#H z^de3ZF5xuJG5jykv<=^(WOUQZ7{m5pjEhMXc&NvrCB|uRSU1h!;(d75UD%2-aN0!} z9V{iZhfffZUqw;yt&%_C#ctk%KgC#B2T{~q=-*jb$2nAMeG%q64zt=}RCvzk;gA^J z#(un?aV~GmdjK>5AHV?ZpjJ4Jj||Gz#m5!4@;>k{zz+ZYgx~5C$f=jA{Vx!1ADE^R zwVU>>0=7Y(1nz(qF&bOwpQiEl+NP`u*lrmB+nobI#HT?U5t;|U-)_89s@_v8HW<_Z z{sYh}koySGNc%`&=O}^yLU5)%ghIdGled5#n12ICN#*4{%>P1~6gB|y-UgU$8vqC` zpc$W7gAQ^&P+{UtiPlx?#d|~J7!63?fj{R5{KOGRZryq4+;u64H(m_pxRpA6uaqsBz6~jh&{z#VsEjJ*jMZ) z_7?|;#bSv#P#h!<7KeyK#bM%bafCQh93_^DcZg-;Xt7+Z5MAOJajZB_tQ5zK6T~X9 zTC5S>;zV(hSS!|v_2Oi4ia1rACQcV;h%?1m;%xCwagGQeh;zkx;(T#|xKLaqE*6)F zcZo~IyTyCNd&Onqa&d)tpSV(7C9W3Ni1&*Rh!2Wu#fQX)#dYE%;-lhv@iB3OxKZ3B zZWgzQkBeKyC&X>ylj3&qDe-A>hxm;6thiI$CGHmYhQMtU}PjCqZlb=ks3za zj7(%?5+k*Y)G<=e$Ye&QFfx^qX^c!~WCkNM8JWe%Y)0;6WDX-LBaD%`jLc(XJ|hbl zS;)vDMiw)&gps=#S<1-WjNHS>y^JhlWH}=%7`cy;m5i)nWHlpe7`dO32N-#fk+qCG z#K^;ptYhR6MjmBkJtL1XvVoC}jBH|LGb39Vd7P20rS^Cpr#QH8>`45l4P;4aaK^PI zKOp7so{)0z5Wt}o`{7jHe;fnisHC(kw>=j1hJt1dnhZNUx}$pdTn(QR|NY)SxR);t zIol5_d#Qp7asfz z%4NFkQU8GO|Fp7(R3SeIk;IRjs1 zzsYsu9Qu)3N1}daQX9|Sth6YXW;cH?Is#+9$$=PgRuL+=EE>)AblbKzzmHWxNq9Xg#fbfCXhG1%q0oL%(MTU z>zNpzskKFD{Ly$OLBnjgPota51~A<%Z0$RSo-$4vrp3Y<-C^s#c3X{yLw(Vxaj3Q* z%7;ZWeIU;F#atGw)CaPgx48ghzTDsJ>Y6gQXPZvaP|is@tc}QWW9I(hFL!Qs3tuo$amuY5jdMq4n2b)gF28l+u(1 zWX(Lp^i}qaD^B`1lIwHyLMPWKU&-Lo|KFGb&sKg%Jl6!aThJWlgQ1%-(9|GmtMP0~ z)i7Yw)69;>#YZ<$G|ilJ1`tC3$&*QQ`Up<8&*z+`3SQT|O{~aGE%bXAeHkXN=@9xt zn+yRhe2Lv;vA#+MbYuW;I^Uo1(4*Y@zNIYdjzVuV56Trq0 z^`f@}M265|7u z`Din3gLatyMC*m!a7#2p8_WyP6L2D_JL-=PLfI)yxXyFWXe*k)bI)ig&p8_wqD_#y z>gwtA4u>Ez2VJ>>yn`wtzsk@=E=C)`I zcHzpS67Z45*tyo*k8i)xod1PE(h{#nO7> zy_R9YlX!=ux|Vo9ttZ~KTdE;b-9o$7I?yNaewE)YO<)Os@s#@@E$g1F-EIxr@8J^Z zc3QfHGorbHV`EAvZ71uKE_c4BFHU$20 z+VQ0?ArA}JQsYC~P1a`Zn(VcV-)9YpceucMI9%*~0&bz^Wl2beLjL^@E%W}Xb}={4 zylXdT>k0R^a0ND`M_XyPSu5&CS~(2b_=9_RJ#-Xbx#>%C)}3KYZ{QafmuF)iiTRo%Nfh` ziiY}^R@0cqcuiwJoIh1z#us>51MU>(Swpzi+@qQ#NN#b}B=wQ{O8un%(g3MgDv<_C zgQUUI5NW71Od2kYkVZCy~orZh{ME!`>2kyMFEbESFGd})ESP+BA{mX=6&NlT@>rF*1% zrDf7`X@zv3v{G6nt(MkE_e&2*4@zsLhopz4bOeQQ9PJmbOTbOIxKU zq;1lZ(st=7>1k<)^o;bZv{Tw8?UwdPd!^^3ebRpEdFch|Md>B!fb_C-PzG6^r7^T^s#hOIwgG~ot8e8&Pbn0 zXQj`jbJBU~3+YSgg7lU2we*ejt@NGrz4U{0QTkE(N%~p3B>f`&D*Yz?F8v{0mj0Cf zlCDU9OIM|9G+w$PBN@v?rm`R#WTR}7&9X&qA&atAmSkDB$#z+h{bYYRKn|3HMqXy*AS16Z@+u>*G4eVihZs4`$Qz8j$p~=v+l(AxLXk;{zy$;e-f zTw&yIMnKD5W8^v`HyA~XVn*TZ6O>VbQ3In!Moo;G8MQFlf>DuCE29#lGNU#|?Tjjn z`Z4OyXaJ*uj0Q0p%xFtSLl_NZG>p-3Mk5%FWHgFV2cyx9#xNSoXdI)h7>#E%fzd=p zlNe2AG=))kt3?{4@Rp0#jAk(EWHgh}EJm{#&0#c`(L6@;87*M6kkKMW+c0_?qiq?z zozZrTwr8{hqa7LT#As(myD-|7(Qb@(XS4^SJsIuAXm3XQFxr>VevI~KbO58pjFvDu zkkLVm4rX)+qeB@T#^`WHN2u!<9m(h@MoSsJgV8cZM>AT^Xa%D#M#nHZmeFyHRx&!C z(Fu%JFnqjxeohf$SL z#^_u|=P^2;(FKeyWONauiy2+Q=v|C1W%O=F?_u;_Mwc%3jI|fuPHc55nPH8p9m_MF>~O3ko@*2n!Vaj)JG#ixsk3 z5gdxpQlU2#dP%{mLJlZ6RUumx`kg|c#{xx|uL!p*LWqLOFceV)Nf88vEL2Eeg}kH? z7%fu40~GwFB2+5`&^AROdlYg=!ABG!Rv{lM^cRJ^p^(QFAx|Ly#ta3gC=~E9R}q+f zkRo(a$QniHqtFCJ0FpeYkRuA2p%6f5M@0x#FiZ~PWhuB?!97783L_N3VjrfEtqO@y z1XZEQijb%fAWIj8tWbn`3LdM_zZD@!A#W-8n0~l74oz~b}NEe5deI*9njiK z5vmkCNx>P40N@uZ0^kL3+D@UrDMGYDHY>E1LiQ^7YlWB<48$0zkX;Jdp^#Wb0Jwt{ z@}?rhC_5|9%W!mDdK!Fy&(&=}KB(>^mbw=gT_D6`Yt z+dSMn)?8<1u#I&symIVy^T+0IEz}}eLSbK6lqJT}%902#7E80VhF6Q_Sn}cZVz*gt zhu4dBhS!Vrgjb8*VHpiC7Q553$gkY&APhh?ATh~J3@d~45T*rV{`ubuFEuYK@hua~qJ zdA$#>HP=J;t7Dzs-KTy}iAoy|aCgeTaRS zeT03KeXPCGKG9xlueVRJ-*11={*Zm0{Zad4_Ko(<_Q&nd*mv5Wv+uXRVE;{_iloFU z$x2&gu;NxGDRs(ZWri|Kxl>VGK)||yM*|)UI1q3s;8?(W0Urc>81QkxCjqAe z&IJ4#7!c?P%nrOguzTR(z>2_$fs+HL22Ky088|y|PT>5&g@LOBw*_twd^+%%z@34I z0^bij5%_W7=Yih_{vBivQi39bl7sSs+6Rpest%eOG(Tuz(Bh!Gf>s8t33@Q-p`dj^ z8-g|kJr%Sw=%t_!gFXxTI_O%kDL63L5u6j;A-FhrVDRAJp~1t0)!>D}i-Ye9zB~Bd z;N`*h1+NO;8oWFBQ1BbUZv`I-J{tUE@Xx`&1pgNNNARD)S6Y&mww8{TF)ia-#?Ax##;Q`^X;kn`6!iR;A3m+d|6v%*>UUEwRjSB5_v{&@KA@K?i+gntx%HvDS%^#~L}B7_J-gef8_q9kHa z#E^(#5hEf-McffFI-)XSLd5cj`yy6FtciFaVr|5_h({vUM{J0AHsa-ok0b4ots>h+ z7DtYYoEfP`&W)TOxiE5ZN8S^8U*yWj)sgo{J{b9QvcjeIBaROIQ% z&!TKmEu*5NVxtnHlA}_i(xWn>GNZDi@}df&+D3Jb8Xk3b)Xu2gQG28IMLi$&V$^}C z*P`BvdOzw!)W=b$qP~jyG3w{2-=i)^{S|fHfgHqPceHVIbo6o*J1QMh9CtfbJJvgP zJ6?9Y?KtcBE!q%minc_H(Nc8V=yuT^qB})*iS8ENBf3{~pXh$k6Qb**r$jG`UJ|`D z`kv@z(GNtgjouvnc=Qv|Pewl#y(9WW^hePrqd$rMH2SmXbJ6Fczl{DW`g%-IOi@gy zm@YBhVtT~%is=*6KW0EoNlazTgqZ3Wcg&=inK2K57F^|P;jCnogaLk)A zZ^yh7^KQ)Xn6F}KtRdDEYl#(Ot+8@!eC+Vpk+G$*WwGV4uGq1$m9aIklVaz_&W~Lf zyEyi~*d4LY#_o#U6Z>53zS!qu-;XoJS>nVvDb5zB#QDbs#&wA69XB*?c-+Xi(zvp? z(Qy@VW8x~~#>Z8~)x^z;TO79{Ze`s1xD9ce;qytD05| zT5W0dbgR9s4zzl!)sa?5TODh4qSc43&bRuq)mN>)Y4uC1zvG2?dwfKEc6`tH5%Htq z?}#5AUlCsuKPR5W&x>CWzbJld{I>Y*@lVG;6TdTlcl@FFH{*}QAB{gA|84w@1bc#C zLO?=LLd%5P5_%-`O6Zf&FJVAJNy4CnAqhhhsuQLstVwtvVQs>?g!Ks<5;i3~m9QgW zcf#I;eF+~Xe4KD9;dH{8gtH0f623_IA>qe_UlV>$xSSZC7@6ouj7f}3Oh`;hOioNq zOi#>D9GO^}Se96x=t>-$I4*H~;{AyaCO(w7F7eUC^@$r2HzjUPd_3`q#GQ$|6JJSu zE%8v|8;Nfv9!Wf!cs_|H8Inv%<|HM_KPf+{FsV&a+oX0$9g;dGbx!J0HtmNf(m7PHveTnjD@Sne0f8NsdcSOKzQ< znVg;6KDlFZx8xqly^{MU7bg!)E=``2yeN4|^3vpcl9wevl)OFp>EvgUcP8&nK9zhr z`AqWJc+Bc*pr-<19-#VLbQhNM)cRHe96CZ*J; z%t=|5vN`4Plx->7Q+A{rOnEKkaLSu0M^cWboJu*J@=eP3DL|v|u+)fD zM`}!JTxxu3Qfh8$X=-)qjMQ1Fcc#usWvO#h=cg`AU6Q&jb$jZL)Mrz7rS3`HmwGDo zbn0iRpQoNr{WA6I)L+v4(*o04riG@3r$wekr{$#$NgI|nGOaYNEUi3kOxoWLp-H>ih7t`f*B|RWLIK54J z+w}J79n(9fcTMk+-Yb1f`qK1!(wC>-m%b`}P5OiB&!nG8Kbw9&{fqPq>0hOPlm1=$ z#q^(A+gtm!4s0FVI;3@2>&VtwtxH-DYCW{|@YW++m$n|=dRgmdTJLPVr}cBK_qTqb z^?}x3XP7fuWJnpd3?;)qBPgRFV@$@ljPV&0GO9CbGA3r!W=zgloAGeQqZyB7Y|Pl4 zu{GnhjBhf&%lIMV$Bdsde#!Vf$TPnsbJ8mUE7Cu5-0>i*u{&>jUv);)%mi2SiFIm55 zUC#O|>+h`V*-_ci*>TzN*@@Z7*=gB*vioHhXAjICoINyqMD~*GrP=pn-_9xljXJ5?zDf^e~-*ap^j+~gBxSWKXD*^?_vgNy`%dn=xyN(g&;26zLhjeO-{oG+BYFOLfqB7sA$j3>IeA_3 zy5;rA>z&sxuOe@9-qgGqd9(87BBD^E2`@^Rx5w^1J2t%sV{O9tY&p(p?ZvK1uALM_O|5^T5`Iqzm%Ktn6S^+As6oeLp7ep3B z7sM5GF6dg&qo7wopMrh`0}5OPQwtUs+*NRQ!Mz153N{pMD%eu6wP0Jpa|QbgUMzUI z;PZm>1s4jwF8H?K`+|!FmkRzUG!n+mrSZY|ta_*CJ6!h?mc7QSBiM&Yr-&kN5Nep&c+;dh0X3;!y-T6m+# zQ4~|uswkl-sVJo=tthi7zo>gr&!XN%eTxPZjW3#6G`na{(cGd1MO%ut7Cl+?RMG#b z>Ac^YHrqDL421%L6v_xtW*G$mxq5@$JacphQtk^E8$rBEo84FS?H z$|{?(N7*9;LfE^kLZQ&mls&?RGG4ypJ-+*g>;5OM>pa&dZA{vfRFZTs>2T7qq?1Vx zlgg8xCOuDjne;m8t*ySTqm8hUHrnR0d2A`Rpe@~&Wy`UBW1C=`WXrQnwf$&YVq0eW z#kSJ6#rz+YNiZy}&-x{*!%V9_SE*}MDfNVUM!le3QE%v4bSzz$u17bZThZO=M7kHp;h9!`Hx zkD|xWrnl1D>78^TeUd&+|3;suf2VKLcj^1|L;A5J#?iph$Pw>o z=4j#YI#L`#N17wk5pwi%AV+_P?)c6z*)iX-z_G}&)bWdBvtz4chhw+ns^glY)bY3D zAIB}n9mg|g1!rC7C(ioLhR%3rM`veeg0q`5(V6DVaE6>Y&Ri#SYR;j~Jm=5Oh0ev! zWzH4O9nM|OLg!xRe&$~D?G)-~QW(KXpM#kJJ6#kI|~!?oL0YN zcPF}gxs%*>x9A3L$*sCm-4VCpHr@Ym4|I=lk8@9OPj*jrFL!Tq?{M#O7rOVlkGPMy zAG@EqU%Fqr-?-m1m6)o`N6g1eZKf_$k7>X(W|}acF)f+a3}7TiWs;dxCdi~SnM{b8 zz)WKDm?_LOCZ8!_W-zmuy-YDv!W>`@F^8F>%yH%<^MZNB{L8#y-ZAez6+M+bRXtrj z-93q(o}S*GJ|3IL?x8&WJjfIA7#`CT^$hR~^W=G^dh$I5o|&E%o-Lkjo}HdT&!3*_ zo*SMr&rQ#5&t1}`} z$PQwMu*2B->;iT%yOdqdu3%TO+t?lKZnlWM&X%%e>`nGIdzZb>zT+xzmAEQgH7=g( z$aUrtxUO6ej^Y3(aSE5r1-UTSj~m1d;f8XM^&@|OzwXEWsDHda-#=ZLAWRmf2>HTv zVU{pkm@CW|76^-lWx_AQDq*d#LD(d05w;7vghHW6*e8?-hlHcTap9D3MmQ&25Plaf z3s;0|La9(D+!XEz_k~Bo6XBWgLU=8_6)T99#Tc==__0`9tSiCSo(Ox!6i< zBeoMeh@Hd)v74AE_7-iTU8F^q$cUWCi-HJ5Sxgp#V!D_qhQzQ4#r~opn&N-Nf#P8C zTk$*bd+`TxtT;iOBu){hi3Q>e@h5Sv__Mf3Tp}(LSBR^{b>c>Gv$##%Dee}F#A2~T zJR}|wkBjHUi{fSRmRK%65ub}M`&R55(>Jzn9H<6rfSMo{#DV&t0cZr`K~vBiv;u8F zThJbK1f4+w=mru&FVF|r010T|0t{e*7w|v;eL(=oKm{ov2+~0&$Od5mfd(P~0}BiQ z1HoW01Ple=fe~O77!AgP@n9mD45os7FdfVUKY_VmK3D)2fu&$MSP9mEbzmdd47P$D zU>7I^dqFWM0SCcha15LPr@$F-4qO12z!h)}{0067H^Cin4?G0r;0bsJUVvBN4R{}@ z7^obm8mJbi5vUo64a5cN2O0z#2bu;x3$zHd3bYAy4s?;)Nnc2vqy(v(lqmI*`baj( zF42-pVkA!DB~c1UvXm?ZrF1D%3Q1uJO8q5WGNq{WmGreVSQ;V?m4-_rrP0z@X@WFa znkxM$O_yd$v!!{`0%@_dOj;qWlGaKaq)pORX}h#bDwK+(eNu^ZP&y(VlTJ!!q;t|m z>9TZHx+axMWztRQj&xsoC_R>*NiU^;rMJ?1`NJ4ft|r%zYss;4oLpaSD96jqx4S+D%6Y*Dr=yOcf3KBYuC zq#RXFD5sUP$_3?;az(kOlqzM)E#J)SYUfx>wz=9#oI0 z$JJBnZ|ZsVcl8hT&*W;!EtA>g{NxMCx0Bzbe3a5I1*c3*S(UOsiN{t)O*1?!8XA@!IYp8oETgcJQ=(he3}-U=1L2vS!vVLHl!2^l19n^l9ny)3>DWOFxl*BmG%M<%~KRV#dIXsTs2}_GFZ1yvnSZ*)Y?dnVC5} zb9Uy2%p;lavT9`sS)r`qS#z`2W}V4;ko7tg6N(SD3lSkMlo`@PV?za@RiWb0lkE8H z?%8TK&K{CIEqhM(+UyJ2?{jMBw9M(89H^5DBE8GEh!y;G=OW+}R6rO;m;aPYAUV>NPHCPJ&hX26Z@Gg7+%i&Y_0=|ZC zQ3X^P#h~h_CW=LIs2=(hH9}2LGt>gLMr~1h)DeA&x}qMa7wUruL?I_)5QlgqAb@0) zjDjcwg-{qlq@f7HD2fK4foL%L77arq&?qzpjYktv9-4*<&)xOh4Xrr_-+IVe}HbtAJ6=*ZH+1fnqXKj(T zN?RNGDKas^NhRCMK*2s>??nqIjIC3CzIC3m+^iT9p^+tLV{WHC#-bQbyf1!8Q zyXf8Zo_Zgh&?()iGdid9x~KS8`gDDkK1ZLgFVvUl%k`D|8hyR~tG-3wuJ6+K==<~%{g8fCKcS!2&*~TSOZpZ4 znqI1x>9_Q|`UAaOf2zOGU+Zs;3Pxok#;9)8G-8c7qrTD5h&P%UEsWMiTcd-~$w)A| z8Hq-3!)B0%!*Cm{;WGpS7_yOU1dR+MWP}Z9^fx~Eu#Ex6*Ty%-P-D0;(im-wGbS2& z#x$eAm}$&5<{1l&#l|vYg|W(5Yiuw!8C#7V#%`m?C^illhmB*#N#l%h&bVk?Hm(}i zjT^>4#%<%C@z8i|JTqPz{~GUbMO+0}!!>X%TnB%GKgEr36Z{!&iQC|I_zT<_cfs9p zPuvF+n8HrXe1O97Si}LW;1ryOGjTS~#Rx|*#!>tg9)!QaL-BAt5|75?@I;)4r{MxT z6VJx;@B+LTFT*SFYP=3_#GCOpyb~AVy?8%9h>zgo_!RyPpU1!BKk%RUFZ?&YiSOY1 z_z`}BpW|2f4SsJ{GCwwJn{~~4W&^Xa+0<-qwlY6A+nXKDFU_uI53`qQ+rF){3+0Sq-elR#U6F)yn$ZYHxM4zO=epJ*-|jT57t;~f;HKiYW--!fwsI%{39E?HNsYgVaMX5F&x zS`Vyp>#6m^dTqUpR)|)P#zd<}Yer+EanbtGhSB(FvuKNG>uB3(hiIp0LbO{nG1@z7 pi@KwpC>sS)IjTf6quJ4%s2+{}Psv&7|9nXwE|&P;|No4R_%CU;r}Y2; literal 37193 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 diff --git a/mozilla/camino/src/browser/BrowserWindowController.h b/mozilla/camino/src/browser/BrowserWindowController.h index f30192a7952..451a7f59c65 100644 --- a/mozilla/camino/src/browser/BrowserWindowController.h +++ b/mozilla/camino/src/browser/BrowserWindowController.h @@ -357,8 +357,6 @@ typedef enum { - (IBAction)copyImage:(id)sender; - (IBAction)copyImageLocation:(id)sender; -- (IBAction)unblockFlashFromCurrentDomain:(id)sender; - - (BookmarkToolbar*) bookmarkToolbar; - (BOOL)windowClosesQuietly; diff --git a/mozilla/camino/src/browser/BrowserWindowController.mm b/mozilla/camino/src/browser/BrowserWindowController.mm index ad34fb69819..6954a9cdd50 100644 --- a/mozilla/camino/src/browser/BrowserWindowController.mm +++ b/mozilla/camino/src/browser/BrowserWindowController.mm @@ -84,7 +84,6 @@ #import "ToolbarScriptItem.h" #import "SearchEngineManager.h" #import "SearchEngineEditor.h" -#import "FlashblockWhitelistManager.h" // For search plugin description keys: #import "XMLSearchPluginParser.h" @@ -115,12 +114,6 @@ #include "nsNetUtil.h" #include "nsIPref.h" -#include "nsIDOMViewCSS.h" -#include "nsIDOMDocumentView.h" -#include "nsIDOMCSSStyleDeclaration.h" -#include "nsIDOMCSSValue.h" -#include "nsIDOMCSSPrimitiveValue.h" - #include "nsICommandManager.h" #include "nsICommandParams.h" #include "nsIWebBrowser.h" @@ -198,7 +191,6 @@ const int kSpellingRelatedItemsTag = 103; const int kItemsNeedingOpenBehaviorAlternatesTag = 104; const int kItemsNeedingForceAlternateTag = 105; const int kLinkOpeningItemsTag = 106; -const int kFlashblockTag = 107; // Cached toolbar defaults read in from a plist. If null, we'll use // hardcoded defaults. @@ -620,7 +612,6 @@ public: - (void)populateEnginesIntoSearchField:(WebSearchField*)searchField; - (NSString*)lastKnownPreferredSearchEngine; - (void)setLastKnownPreferredSearchEngine:(NSString*)inPreferredEngine; -- (BOOL)isFlashblockElement:(nsIDOMNode*)aNode; @end @@ -4154,7 +4145,6 @@ public: BOOL hasSelection = [[mBrowserView browserView] canCopy]; BOOL isMidas = NO; - BOOL isFlashblock = NO; if (mDataOwner->mContextMenuNode) { nsCOMPtr ownerDoc; @@ -4262,24 +4252,12 @@ public: [mBackItem setEnabled: [[mBrowserView browserView] canGoBack]]; [mForwardItem setEnabled: [[mBrowserView browserView] canGoForward]]; [mCopyItem setEnabled:hasSelection]; - - if ([[PreferenceManager sharedInstance] getBooleanPref:kGeckoPrefBlockFlash withSuccess:NULL] - && [self isFlashblockElement:(mDataOwner->mContextMenuNode)]) { - isFlashblock = YES; - } } // we have to clone the menu and return that, so that we don't change // our only copy of the menu NSMenu* result = [[menuPrototype copy] autorelease]; - if (!isFlashblock) { - NSMenuItem* flashblockItem; - // this removes the separator above the item as well - while ((flashblockItem = [result itemWithTag:kFlashblockTag]) != nil) - [result removeItem:flashblockItem]; - } - if (isUnsafeLink) { NSMenuItem* frameItem; while ((frameItem = [result itemWithTag:kLinkOpeningItemsTag]) != nil) @@ -4736,67 +4714,6 @@ public: } } -// -// -isFlashblockElement: -// -// Returns YES if the element is a Flashblock placeholder. This is achieved by -// looking for chrome://flashblock/content/* as the element's background image. -// -- (BOOL)isFlashblockElement:(nsIDOMNode*)aNode -{ - nsCOMPtr flashElement(do_QueryInterface(aNode)); - if(!flashElement) { - return NO; - } - - nsCOMPtr document; - flashElement->GetOwnerDocument(getter_AddRefs(document)); - nsCOMPtr docView(do_QueryInterface(document)); - if (!docView) { - return NO; - } - - nsCOMPtr defaultView; - docView->GetDefaultView(getter_AddRefs(defaultView)); - nsCOMPtr defaultCSSView(do_QueryInterface(defaultView)); - if (!defaultCSSView) { - return NO; - } - - nsCOMPtr computedStyle; - defaultCSSView->GetComputedStyle(flashElement, EmptyString(), - getter_AddRefs(computedStyle)); - if (!computedStyle) { - return NO; - } - - nsCOMPtr cssValue; - computedStyle->GetPropertyCSSValue(NS_LITERAL_STRING("background-image"), - getter_AddRefs(cssValue)); - nsCOMPtr primitiveValue; - primitiveValue = do_QueryInterface(cssValue); - if (!primitiveValue) { - return NO; - } - - nsAutoString bgStringValue; - primitiveValue->GetStringValue(bgStringValue); - return [[NSString stringWith_nsAString:bgStringValue] - hasPrefix:@"chrome://flashblock/content/"]; -} - -// -// -unblockFlashFromCurrentDomain: -// -// Context menu action for adding the current domain to the Flashblock whitelist. -// -- (IBAction)unblockFlashFromCurrentDomain:(id)sender -{ - NSString *currentDomain = [[[self browserWrapper] browserView] pageLocationHost]; - [[FlashblockWhitelistManager sharedInstance] addFlashblockWhitelistSite:currentDomain]; - [self reload:nil]; -} - - (IBAction)showPageInfo:(id)sender { PageInfoWindowController* pageInfoController = [PageInfoWindowController sharedPageInfoWindowController]; diff --git a/mozilla/camino/src/browser/BrowserWrapper.mm b/mozilla/camino/src/browser/BrowserWrapper.mm index e0340e01b0a..f4b25980750 100644 --- a/mozilla/camino/src/browser/BrowserWrapper.mm +++ b/mozilla/camino/src/browser/BrowserWrapper.mm @@ -59,7 +59,6 @@ #include "CHBrowserService.h" #include "ContentClickListener.h" -#import "FlashblockWhitelistManager.h" #include "nsCOMPtr.h" #include "nsIMutableArray.h" @@ -95,6 +94,131 @@ enum StatusPriority { }; NSString* const kBrowserInstanceClosedNotification = @"BrowserInstanceClosed"; +static NSString* const kFlashBlockWhitelistChangedNotificationName = @"FlashBlockWhitelistChanged"; + +// +// interface FlashblockWhitelistManager +// +// A singleton class to manage list of sites where Flash is allowed +// when otherwise Flash is blocked +// + +@interface FlashblockWhitelistManager : NSObject +{ + NSString* mFlashblockWhitelistPref; // STRONG + NSMutableArray* mFlashblockWhitelistSites; // STRONG +} + +// Returns the shared FlashblockWhitelistManager instance. ++ (FlashblockWhitelistManager*)sharedInstance; + +// Loads whitelisted sites from preference +- (void)reloadWhitelistSites; + +// Checks if Flash is allowed for the site +- (BOOL)isFlashAllowedForSite:(NSString*)site; + +@end + +static FlashblockWhitelistManager* sFlashblockWhitelistManager = nil; + +@implementation FlashblockWhitelistManager + ++ (FlashblockWhitelistManager*)sharedInstance +{ + if (!sFlashblockWhitelistManager) + sFlashblockWhitelistManager = [[self alloc] init]; + + return sFlashblockWhitelistManager; +} + +- (id)init +{ + [self reloadWhitelistSites]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(reloadWhitelistSites) + name:kFlashBlockWhitelistChangedNotificationName + object:nil]; + + return self; +} + +// Currently dealloc won't be called since there is no callback to tell the instance +// that the application is shutting down. But nothing happens here that isn't already +// taken care of when the application closes, so we don't need to enforce calling this. +- (void)dealloc +{ + [mFlashblockWhitelistPref release]; + [mFlashblockWhitelistSites release]; + + sFlashblockWhitelistManager = nil; + + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [super dealloc]; +} + +- (void)reloadWhitelistSites +{ + NSString* whitelistPref = [[PreferenceManager sharedInstance] getStringPref:"flashblock.whitelist" withSuccess:NULL]; + + // Update array of whitelisted sites only if the preference has changed + if (!mFlashblockWhitelistPref || ![mFlashblockWhitelistPref isEqualToString:whitelistPref]) { + [mFlashblockWhitelistPref release]; + mFlashblockWhitelistPref = [whitelistPref retain]; + + if (!mFlashblockWhitelistSites) + mFlashblockWhitelistSites = [[NSMutableArray alloc] init]; + else + [mFlashblockWhitelistSites removeAllObjects]; + + // Whitelist is a string with format: + // siteA.com,www.siteB.com,*.siteC.com + NSArray* whitelistSites = [mFlashblockWhitelistPref componentsSeparatedByString:@","]; + NSEnumerator* prefEnumerator = [whitelistSites objectEnumerator]; + NSString* prefSite; + while ((prefSite = [prefEnumerator nextObject])) { + // Require at least one '.' so that an entry of 'com' or an empty string won't + // match every site. + if ([prefSite rangeOfString:@"."].location == NSNotFound) + continue; + + prefSite = [[prefSite lowercaseString] stringByTrimmingCharactersInSet: + [NSCharacterSet whitespaceAndNewlineCharacterSet]]; + + // Goal: For 'site.com' whitelist, match www.site.com and site.com, but not thesite.com. + // Strategy: Append '.' to whitelist strings, then match the end of the site string + // with the whitelist strings. This will prevent 'site.com' from matching the end of + // thesite.com but will match site.com and www.site.com.If site string is not in proper + // format, it will (gracefully) not match. + if ([prefSite rangeOfString:@"*."].location == 0) + prefSite = [prefSite substringFromIndex:1]; + else + prefSite = [@"." stringByAppendingString:prefSite]; + + [mFlashblockWhitelistSites addObject:prefSite]; + } + } +} + +- (BOOL)isFlashAllowedForSite:(NSString*)site +{ + // As above, add "." to the beginning of site so that site.com will match a whitelist + // of site.com that has been saved in the array as '.site.com' + site = [@"." stringByAppendingString:site]; + + NSEnumerator* enumerator = [mFlashblockWhitelistSites objectEnumerator]; + NSString* whitelistSite; + while ((whitelistSite = [enumerator nextObject])) { + if ([site hasSuffix:whitelistSite]) + return YES; + } + + return NO; +} + +@end @interface BrowserWrapper(Private) diff --git a/mozilla/camino/src/browser/FlashblockWhitelistManager.h b/mozilla/camino/src/browser/FlashblockWhitelistManager.h deleted file mode 100644 index 5833cf8087d..00000000000 --- a/mozilla/camino/src/browser/FlashblockWhitelistManager.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Bryan Atwood - * Portions created by the Initial Developer are Copyright (C) 2002 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Bryan Atwood - * Christopher Henderson - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#import - -// -// interface FlashblockWhitelistManager -// -// A singleton class to manage list of sites where Flash is allowed -// when otherwise Flash is blocked -// -@interface FlashblockWhitelistManager : NSObject -{ - NSString* mFlashblockWhitelistPref; // STRONG - NSMutableArray* mFlashblockWhitelistSites; // STRONG - NSCharacterSet* mFlashblockSiteCharSet; // STRONG -} - -// Returns the shared FlashblockWhitelistManager instance. -+ (FlashblockWhitelistManager*)sharedInstance; - -// Loads whitelisted sites from the preference. -- (void)loadWhitelistSites; - -// Sets the Flashblock whitelist Gecko preference to the current whitelist array. -- (void)saveFlashblockWhitelist; - -// Adds the site to the Flashblock whitelist, if valid and not already present. -// aSite should be just the host (site.tld, sub.site.tld, or *.site.tld). -// Returns YES if the site was added. -- (BOOL)addFlashblockWhitelistSite:(NSString*)aSite; - -// Removes the site from the whitelist, if present, and saves the modified list. -// aSite should be just the host (site.tld, sub.site.tld, or *.site.tld). -- (void)removeFlashblockWhitelistSite:(NSString*)aSite; - -// Returns YES if the site or any of its subdomains is in the whitelist. -// aSite should be just the host (site.tld or sub.site.tld). -- (BOOL)isFlashAllowedForSite:(NSString*)aSite; - -// Returns YES if the string contains a valid site and is not already in the -// whitelist. -// aSite should be just the host (site.tld, sub.site.tld, or *.site.tld). -- (BOOL)canAddToWhitelist:(NSString*)aSite; - -// Returns YES if string contains a valid site. -// aSite should be just the host (site.tld, sub.site.tld, or *.site.tld). -- (BOOL)isValidFlashblockSite:(NSString*)aSite; - -// The current array of whitelist sites. -- (NSArray*)whitelistArray; - -@end diff --git a/mozilla/camino/src/browser/FlashblockWhitelistManager.mm b/mozilla/camino/src/browser/FlashblockWhitelistManager.mm deleted file mode 100644 index 5f8ccbc6972..00000000000 --- a/mozilla/camino/src/browser/FlashblockWhitelistManager.mm +++ /dev/null @@ -1,256 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Bryan Atwood - * Portions created by the Initial Developer are Copyright (C) 2002 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Bryan Atwood - * Christopher Henderson - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#import "FlashblockWhitelistManager.h" - -#import "PreferenceManager.h" -#import "NSString+Utils.h" - -static FlashblockWhitelistManager* sFlashblockWhitelistManager = nil; -static NSString* const kFlashblockWhitelistChangedNotificationName = @"FlashblockWhitelistChanged"; - -@implementation FlashblockWhitelistManager - -+ (FlashblockWhitelistManager*)sharedInstance -{ - if (!sFlashblockWhitelistManager) - sFlashblockWhitelistManager = [[self alloc] init]; - - return sFlashblockWhitelistManager; -} - -- (id)init -{ - if ((self = [super init])) { - [self loadWhitelistSites]; - - [[PreferenceManager sharedInstance] addObserver:self forPref:kGeckoPrefFlashblockWhitelist]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(loadWhitelistSites) - name:kPrefChangedNotificationName - object:self]; // since we added ourself as the Gecko pref observer - } - return self; -} - -// Currently dealloc won't be called since there is no callback to tell the instance -// that the application is shutting down. But nothing happens here that isn't already -// taken care of when the application closes, so we don't need to enforce calling this. -- (void)dealloc -{ - [mFlashblockWhitelistPref release]; - [mFlashblockWhitelistSites release]; - [mFlashblockSiteCharSet release]; - - sFlashblockWhitelistManager = nil; - - [[PreferenceManager sharedInstanceDontCreate] removeObserver:self forPref:kGeckoPrefFlashblockWhitelist]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [super dealloc]; -} - -// -// -loadWhitelistSites: -// -// Load the list of Flashblock whitelist sites from the Gecko preference. -// Parse each site to allow subdomain matching within |isFlashAllowedForSite|. -// Post a notification that the whitelist has changed, so that observers can -// obtain an updated list using |whitelistArray|. -// -- (void)loadWhitelistSites -{ - NSString* whitelistPref = [[PreferenceManager sharedInstance] getStringPref:kGeckoPrefFlashblockWhitelist - withSuccess:NULL]; - // Update array of whitelisted sites only if the preference has changed - if (!mFlashblockWhitelistPref || ![mFlashblockWhitelistPref isEqualToString:whitelistPref]) { - [mFlashblockWhitelistPref release]; - mFlashblockWhitelistPref = [whitelistPref retain]; - - if (!mFlashblockWhitelistSites) - mFlashblockWhitelistSites = [[NSMutableArray alloc] init]; - else - [mFlashblockWhitelistSites removeAllObjects]; - - // Whitelist is a string with format: - // siteA.tld, www.siteB.tld, *.siteC.tld - NSArray* whitelistSites = [mFlashblockWhitelistPref componentsSeparatedByString:@","]; - NSEnumerator* prefEnumerator = [whitelistSites objectEnumerator]; - NSString* prefSite; - while ((prefSite = [prefEnumerator nextObject])) { - // Require at least one '.' so that an entry of 'tld' or an empty string won't - // match every site. - if ([prefSite rangeOfString:@"."].location == NSNotFound) - continue; - - prefSite = [[prefSite lowercaseString] stringByTrimmingCharactersInSet: - [NSCharacterSet whitespaceAndNewlineCharacterSet]]; - - // Goal: For 'site.tld' whitelist, match www.site.tld and site.tld, but not thesite.tld. - // Strategy: Append '.' to whitelist strings, then match the end of the site string - // with the whitelist strings. This will prevent 'site.tld' from matching the end of - // thesite.tld but will match site.tld and www.site.tld. If site string is not in proper - // format, it will (gracefully) not match. - if ([prefSite rangeOfString:@"*."].location == 0) - prefSite = [prefSite substringFromIndex:1]; - else - prefSite = [@"." stringByAppendingString:prefSite]; - - [mFlashblockWhitelistSites addObject:prefSite]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:kFlashblockWhitelistChangedNotificationName object:nil]; - } -} - -- (void)saveFlashblockWhitelist -{ - NSArray* arrayToSave = [self whitelistArray]; - NSString* siteString = [arrayToSave componentsJoinedByString:@","]; - [[PreferenceManager sharedInstance] setPref:kGeckoPrefFlashblockWhitelist toString:siteString]; -} - -- (BOOL)addFlashblockWhitelistSite:(NSString*)aSite -{ - NSString* site = [aSite stringByRemovingCharactersInSet: - [NSCharacterSet whitespaceAndNewlineCharacterSet]]; - - // Remove any protocol specifier (eg. "http://") - NSRange protocolRange = [site rangeOfString:@"://"]; - if (protocolRange.location != NSNotFound) - site = [site substringFromIndex:(protocolRange.location + protocolRange.length)]; - - // Only add a Flashblock whitelist site if it's properly formatted and not already added - if ([self canAddToWhitelist:site]) { - [mFlashblockWhitelistSites addObject:site]; - [self saveFlashblockWhitelist]; - return YES; - } else { - return NO; - } -} - -- (void)removeFlashblockWhitelistSite:(NSString*)aSite -{ - [mFlashblockWhitelistSites removeObject:[@"." stringByAppendingString:aSite]]; - [self saveFlashblockWhitelist]; -} - -- (BOOL)isFlashAllowedForSite:(NSString*)aSite -{ - // As above, add "." to the beginning of site so that site.tld will match a whitelist - // of site.tld that has been saved in the array as '.site.tld' - aSite = [@"." stringByAppendingString:aSite]; - NSEnumerator* enumerator = [mFlashblockWhitelistSites objectEnumerator]; - NSString* whitelistSite; - while ((whitelistSite = [enumerator nextObject])) { - if ([aSite hasSuffix:whitelistSite]) - return YES; - } - - return NO; -} - -- (BOOL)canAddToWhitelist:(NSString*)aSite -{ - return ([self isValidFlashblockSite:aSite] - && ![mFlashblockWhitelistSites containsObject:[@"." stringByAppendingString:aSite]]); -} - -- (BOOL)isValidFlashblockSite:(NSString*)aSite -{ - if ([aSite length] == 0) - return NO; - - // Reuse character string for hostname validation since it's expensive to make. - if (!mFlashblockSiteCharSet) { - NSMutableCharacterSet* charSet = [[[NSCharacterSet alphanumericCharacterSet] mutableCopy] autorelease]; - [charSet addCharactersInString:@"-_"]; - mFlashblockSiteCharSet = [charSet copy]; - } - - // Site may begin with '*.', in which case drop the first 2 characters. - if ([aSite rangeOfString:@"*."].location == 0) - aSite = [aSite substringFromIndex:2]; - - // Split string on '.' and check components for valid string. - NSArray* subdomains = [aSite componentsSeparatedByString:@"."]; - - // There must be at least two components (e.g., something.tld) - if ([subdomains count] < 2) - return NO; - - NSEnumerator* enumerator = [subdomains objectEnumerator]; - NSString* subdomain; - while ((subdomain = [enumerator nextObject])) { - if ([subdomain length] == 0) - return NO; - NSScanner* scanner = [NSScanner scannerWithString:subdomain]; - [scanner scanCharactersFromSet:mFlashblockSiteCharSet intoString:NULL]; - if (![scanner isAtEnd]) - return NO; - } - - return YES; -} - -// -// -whitelistArray: -// -// Returns an array of the current entries in the whitelist. Removes the dots -// at the beginning of each string, making them suitable for displaying in -// the Web Features preference pane and for saving to the preference. -// -- (NSArray*)whitelistArray -{ - NSEnumerator* enumerator = [mFlashblockWhitelistSites objectEnumerator]; - NSString* singleSite; - NSMutableArray* noDotArray = [NSMutableArray arrayWithCapacity:[mFlashblockWhitelistSites count]]; - while ((singleSite = (NSString*)[enumerator nextObject])) { - if ([singleSite rangeOfString:@"*."].location == 0) - [noDotArray addObject:[singleSite substringFromIndex:2]]; - else if ([singleSite rangeOfString:@"."].location == 0) - [noDotArray addObject:[singleSite substringFromIndex:1]]; - else - [noDotArray addObject:singleSite]; - } - return noDotArray; -} - -@end - diff --git a/mozilla/camino/src/preferences/GeckoPrefConstants.h b/mozilla/camino/src/preferences/GeckoPrefConstants.h index daa9abf7d1e..badb8ff0b91 100644 --- a/mozilla/camino/src/preferences/GeckoPrefConstants.h +++ b/mozilla/camino/src/preferences/GeckoPrefConstants.h @@ -113,9 +113,6 @@ extern const char* const kGeckoPrefBlockAds; // bool // Controls whether Flashblock is enabled extern const char* const kGeckoPrefBlockFlash; // bool -// The whitelist of allowed Flash sites -extern const char* const kGeckoPrefFlashblockWhitelist; // string - // Controls how animated images are allowed to animate extern const char* const kGeckoPrefImageAnimationBehavior; // string // Possible values: diff --git a/mozilla/camino/src/preferences/GeckoPrefConstants.mm b/mozilla/camino/src/preferences/GeckoPrefConstants.mm index 992ec43ad82..daecedddf58 100644 --- a/mozilla/camino/src/preferences/GeckoPrefConstants.mm +++ b/mozilla/camino/src/preferences/GeckoPrefConstants.mm @@ -113,7 +113,6 @@ const char* const kGeckoPrefEnablePlugins = "camino.enable_plugins"; const char* const kGeckoPrefBlockPopups = "dom.disable_open_during_load"; const char* const kGeckoPrefBlockAds = "camino.enable_ad_blocking"; const char* const kGeckoPrefBlockFlash = "camino.enable_flashblock"; -const char* const kGeckoPrefFlashblockWhitelist = "flashblock.whitelist"; const char* const kGeckoPrefImageAnimationBehavior = "image.animation_mode"; const char* const kGeckoPrefPreventDOMWindowResize = "dom.disable_window_move_resize"; const char* const kGeckoPrefPreventDOMStatusChange = "dom.disable_window_status_change";