summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/chrome_browser_application_mac.h15
-rw-r--r--chrome/browser/chrome_browser_application_mac.mm43
-rw-r--r--chrome/browser/chrome_browser_main.cc13
-rw-r--r--chrome/browser/chrome_browser_main_mac.mm29
-rw-r--r--chrome/browser/mac/dock.mm17
-rw-r--r--chrome/browser/mac/keystone_glue.mm13
6 files changed, 44 insertions, 86 deletions
diff --git a/chrome/browser/chrome_browser_application_mac.h b/chrome/browser/chrome_browser_application_mac.h
index 0801fbb..52c6be3 100644
--- a/chrome/browser/chrome_browser_application_mac.h
+++ b/chrome/browser/chrome_browser_application_mac.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -10,12 +10,9 @@
#import <AppKit/AppKit.h>
-#include <vector>
-
#import "base/mac/scoped_sending_event.h"
#import "base/memory/scoped_nsobject.h"
#import "base/message_pump_mac.h"
-#include "base/synchronization/lock.h"
// Event hooks must implement this protocol.
@protocol CrApplicationEventHookProtocol
@@ -32,12 +29,8 @@
scoped_nsobject<NSMutableArray> eventHooks_;
// App's previous key windows. Most recent key window is last.
- // Does not include current key window. Elements of this vector are weak
- // references.
- std::vector<NSWindow*> previousKeyWindows_;
-
- // Guards previousKeyWindows_.
- base::Lock previousKeyWindowsLock_;
+ // Does not include current key window.
+ scoped_nsobject<NSMutableArray> previousKeyWindows_;
}
// Our implementation of |-terminate:| only attempts to terminate the
@@ -59,7 +52,7 @@
// Keep track of the previous key windows and whether windows are being
// cycled for use in determining whether a Panel window can become the
// key window.
-- (NSWindow*)previousKeyWindow;
+- (id)previousKeyWindow;
- (BOOL)isCyclingWindows;
@end
diff --git a/chrome/browser/chrome_browser_application_mac.mm b/chrome/browser/chrome_browser_application_mac.mm
index 765cec2..76c1660 100644
--- a/chrome/browser/chrome_browser_application_mac.mm
+++ b/chrome/browser/chrome_browser_application_mac.mm
@@ -211,15 +211,8 @@ void SwizzleInit() {
// Used to determine when a Panel window can become the key window.
@interface NSApplication (PanelsCanBecomeKey)
- (void)_cycleWindowsReversed:(BOOL)arg1;
-- (id)_removeWindow:(NSWindow*)window;
-- (id)_setKeyWindow:(NSWindow*)window;
-@end
-
-@interface BrowserCrApplication (PrivateInternal)
-
-// This must be called under the protection of previousKeyWindowsLock_.
-- (void)removePreviousKeyWindow:(NSWindow*)window;
-
+- (id)_removeWindow:(id)window;
+- (id)_setKeyWindow:(id)window;
@end
@implementation BrowserCrApplication
@@ -234,6 +227,7 @@ void SwizzleInit() {
SwizzleInit();
if ((self = [super init])) {
eventHooks_.reset([[NSMutableArray alloc] init]);
+ previousKeyWindows_.reset([[NSMutableArray alloc] init]);
}
// Sanity check to alert if overridden methods are not supported.
@@ -522,11 +516,8 @@ void SwizzleInit() {
return cyclingWindows_;
}
-- (id)_removeWindow:(NSWindow*)window {
- {
- base::AutoLock lock(previousKeyWindowsLock_);
- [self removePreviousKeyWindow:window];
- }
+- (id)_removeWindow:(id)window {
+ [previousKeyWindows_ removeObject:window];
id result = [super _removeWindow:window];
// Ensure app has a key window after a window is removed.
@@ -546,35 +537,21 @@ void SwizzleInit() {
return result;
}
-- (id)_setKeyWindow:(NSWindow*)window {
+- (id)_setKeyWindow:(id)window {
// |window| is nil when the current key window is being closed.
// A separate call follows with a new value when a new key window is set.
// Closed windows are not tracked in previousKeyWindows_.
if (window != nil) {
- base::AutoLock lock(previousKeyWindowsLock_);
- [self removePreviousKeyWindow:window];
+ [previousKeyWindows_ removeObject:window];
NSWindow* currentKeyWindow = [self keyWindow];
if (currentKeyWindow != nil && currentKeyWindow != window)
- previousKeyWindows_.push_back(window);
+ [previousKeyWindows_ addObject:currentKeyWindow];
}
return [super _setKeyWindow:window];
}
-- (NSWindow*)previousKeyWindow {
- base::AutoLock lock(previousKeyWindowsLock_);
- return previousKeyWindows_.empty() ? nil : previousKeyWindows_.back();
+- (id)previousKeyWindow {
+ return [previousKeyWindows_ lastObject];
}
-
-- (void)removePreviousKeyWindow:(NSWindow*)window {
- previousKeyWindowsLock_.AssertAcquired();
- std::vector<NSWindow*>::iterator window_iterator =
- std::find(previousKeyWindows_.begin(),
- previousKeyWindows_.end(),
- window);
- if (window_iterator != previousKeyWindows_.end()) {
- previousKeyWindows_.erase(window_iterator);
- }
-}
-
@end
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 78b62df..70b629a 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -164,6 +164,7 @@
#include <Security/Security.h>
#include "base/mac/scoped_nsautorelease_pool.h"
+#include "chrome/browser/mac/install_from_dmg.h"
#include "chrome/browser/mac/keystone_glue.h"
#endif
@@ -1548,6 +1549,18 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
translate_manager_ = TranslateManager::GetInstance();
DCHECK(translate_manager_ != NULL);
+#if defined(OS_MACOSX)
+ if (!parsed_command_line().HasSwitch(switches::kNoFirstRun)) {
+ // Disk image installation is sort of a first-run task, so it shares the
+ // kNoFirstRun switch.
+ if (MaybeInstallFromDiskImage()) {
+ // The application was installed and the installed copy has been
+ // launched. This process is now obsolete. Exit.
+ return content::RESULT_CODE_NORMAL_EXIT;
+ }
+ }
+#endif
+
// TODO(stevenjb): Move WIN and MACOSX specific code to apprpriate Parts.
// (requires supporting early exit).
PostProfileInit();
diff --git a/chrome/browser/chrome_browser_main_mac.mm b/chrome/browser/chrome_browser_main_mac.mm
index 8264490..493f8ea 100644
--- a/chrome/browser/chrome_browser_main_mac.mm
+++ b/chrome/browser/chrome_browser_main_mac.mm
@@ -16,7 +16,6 @@
#include "chrome/app/breakpad_mac.h"
#import "chrome/browser/app_controller_mac.h"
#import "chrome/browser/chrome_browser_application_mac.h"
-#include "chrome/browser/mac/install_from_dmg.h"
#import "chrome/browser/mac/keystone_glue.h"
#include "chrome/browser/metrics/metrics_service.h"
#include "chrome/common/chrome_paths.h"
@@ -95,30 +94,6 @@ void ChromeBrowserMainPartsMac::PreMainMessageLoopStart() {
ResourceBundle::AddDataPackToSharedInstance(resources_pack_path);
}
- // This is a no-op if the KeystoneRegistration framework is not present.
- // The framework is only distributed with branded Google Chrome builds.
- [[KeystoneGlue defaultKeystoneGlue] registerWithKeystone];
-
- // Disk image installation is sort of a first-run task, so it shares the
- // kNoFirstRun switch.
- //
- // This needs to be done after the resource bundle is initialized (for
- // access to localizations in the UI) and after Keystone is initialized
- // (because the installation may need to promote Keystone) but before the
- // app controller is set up (and thus before MainMenu.nib is loaded, because
- // the app controller assumes that a browser has been set up and will crash
- // upon receipt of certain notifications if no browser exists), before
- // anyone tries doing anything silly like firing off an import job, and
- // before anything creating preferences like Local State in order for the
- // relaunched installed application to still consider itself as first-run.
- if (!parsed_command_line().HasSwitch(switches::kNoFirstRun)) {
- if (MaybeInstallFromDiskImage()) {
- // The application was installed and the installed copy has been
- // launched. This process is now obsolete. Exit.
- exit(0);
- }
- }
-
// Now load the nib (from the right bundle).
scoped_nsobject<NSNib>
nib([[NSNib alloc] initWithNibNamed:@"MainMenu"
@@ -129,6 +104,10 @@ void ChromeBrowserMainPartsMac::PreMainMessageLoopStart() {
// Make sure the app controller has been created.
DCHECK([NSApp delegate]);
+ // This is a no-op if the KeystoneRegistration framework is not present.
+ // The framework is only distributed with branded Google Chrome builds.
+ [[KeystoneGlue defaultKeystoneGlue] registerWithKeystone];
+
// Prevent Cocoa from turning command-line arguments into
// |-application:openFiles:|, since we already handle them directly.
[[NSUserDefaults standardUserDefaults]
diff --git a/chrome/browser/mac/dock.mm b/chrome/browser/mac/dock.mm
index 39c33b9..0c52150 100644
--- a/chrome/browser/mac/dock.mm
+++ b/chrome/browser/mac/dock.mm
@@ -243,15 +243,24 @@ void AddIcon(NSString* installed_path, NSString* dmg_app_path) {
return;
}
+ // Directories in the Dock's plist are given with trailing slashes. Since
+ // installed_path and dmg_app_path both refer to application bundles,
+ // they're directories and will show up with trailing slashes. This is an
+ // artifact of the Dock's internal use of CFURL. Look for paths that match,
+ // and when adding an item to the Dock's plist, keep it in the form that the
+ // Dock likes.
+ NSString* installed_path_dock = [installed_path stringByAppendingString:@"/"];
+ NSString* dmg_app_path_dock = [dmg_app_path stringByAppendingString:@"/"];
+
NSUInteger already_installed_app_index = NSNotFound;
NSUInteger app_index = NSNotFound;
for (NSUInteger index = 0; index < [persistent_apps count]; ++index) {
NSString* app_path = [persistent_app_paths objectAtIndex:index];
- if ([app_path isEqualToString:installed_path]) {
+ if ([app_path isEqualToString:installed_path_dock]) {
// If the Dock already contains a reference to the newly installed
// application, don't add another one.
already_installed_app_index = index;
- } else if ([app_path isEqualToString:dmg_app_path]) {
+ } else if ([app_path isEqualToString:dmg_app_path_dock]) {
// If the Dock contains a reference to the application on the disk
// image, replace it with a reference to the newly installed
// application. However, if the Dock contains a reference to both the
@@ -355,7 +364,7 @@ void AddIcon(NSString* installed_path, NSString* dmg_app_path) {
}
// Set up the new Dock tile.
- NSURL* url = [NSURL fileURLWithPath:installed_path isDirectory:YES];
+ NSURL* url = [NSURL fileURLWithPath:installed_path_dock];
NSDictionary* url_dict = NSURLCopyDictionary(url);
if (!url_dict) {
LOG(ERROR) << "couldn't create url_dict";
@@ -371,7 +380,7 @@ void AddIcon(NSString* installed_path, NSString* dmg_app_path) {
// Add the new tile to the Dock.
[persistent_apps insertObject:new_tile atIndex:app_index];
- [persistent_app_paths insertObject:installed_path atIndex:app_index];
+ [persistent_app_paths insertObject:installed_path_dock atIndex:app_index];
made_change = true;
}
diff --git a/chrome/browser/mac/keystone_glue.mm b/chrome/browser/mac/keystone_glue.mm
index 4236206..8b00373 100644
--- a/chrome/browser/mac/keystone_glue.mm
+++ b/chrome/browser/mac/keystone_glue.mm
@@ -892,12 +892,6 @@ NSString* const kVersionKey = @"KSVersion";
// Upon completion, ksr::KSRegistrationPromotionDidCompleteNotification will
// be posted, and -promotionComplete: will be called.
-
- // If synchronous, see to it that this happens immediately. Give it a
- // 10-second deadline.
- if (synchronous) {
- CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, false);
- }
}
- (void)promotionComplete:(NSNotification*)notification {
@@ -916,13 +910,6 @@ NSString* const kVersionKey = @"KSVersion";
authorization_.reset();
[self updateStatus:kAutoupdatePromoteFailed version:nil];
}
-
- if (synchronousPromotion_) {
- // The run loop doesn't need to wait for this any longer.
- CFRunLoopRef runLoop = CFRunLoopGetCurrent();
- CFRunLoopStop(runLoop);
- CFRunLoopWakeUp(runLoop);
- }
}
- (void)changePermissionsForPromotionAsync {