|
217 | 217 | return settings; |
218 | 218 | } |
219 | 219 |
|
| 220 | +// copied from GetLoginItemForApp in base/mac/mac_util.mm |
| 221 | +LSSharedFileListItemRef GetLoginItemForApp() { |
| 222 | + base::ScopedCFTypeRef<LSSharedFileListRef> login_items( |
| 223 | + LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL)); |
| 224 | + if (!login_items.get()) { |
| 225 | + LOG(ERROR) << "Couldn't get a Login Items list."; |
| 226 | + return NULL; |
| 227 | + } |
| 228 | + base::scoped_nsobject<NSArray> login_items_array( |
| 229 | + base::mac::CFToNSCast(LSSharedFileListCopySnapshot(login_items, NULL))); |
| 230 | + NSURL* url = [NSURL fileURLWithPath:[base::mac::MainBundle() bundlePath]]; |
| 231 | + for (NSUInteger i = 0; i < [login_items_array count]; ++i) { |
| 232 | + LSSharedFileListItemRef item = |
| 233 | + reinterpret_cast<LSSharedFileListItemRef>(login_items_array[i]); |
| 234 | + CFURLRef item_url_ref = NULL; |
| 235 | + if (LSSharedFileListItemResolve(item, 0, &item_url_ref, NULL) == noErr && |
| 236 | + item_url_ref) { |
| 237 | + base::ScopedCFTypeRef<CFURLRef> item_url(item_url_ref); |
| 238 | + if (CFEqual(item_url, url)) { |
| 239 | + CFRetain(item); |
| 240 | + return item; |
| 241 | + } |
| 242 | + } |
| 243 | + } |
| 244 | + return NULL; |
| 245 | +} |
| 246 | + |
| 247 | +void RemoveFromLoginItems() { |
| 248 | + base::ScopedCFTypeRef<LSSharedFileListRef> list( |
| 249 | + LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL)); |
| 250 | + if (!list) { |
| 251 | + LOG(ERROR) << "Unable to access shared file list"; |
| 252 | + return; |
| 253 | + } |
| 254 | + |
| 255 | + if (GetLoginItemForApp() != NULL) { |
| 256 | + base::scoped_nsobject<NSArray> login_items_array( |
| 257 | + base::mac::CFToNSCast(LSSharedFileListCopySnapshot(list, NULL))); |
| 258 | + |
| 259 | + if (!login_items_array) { |
| 260 | + LOG(ERROR) << "No items in list of auto-loaded apps"; |
| 261 | + return; |
| 262 | + } |
| 263 | + |
| 264 | + for (NSUInteger i = 0; i < [login_items_array count]; ++i) { |
| 265 | + LSSharedFileListItemRef item = |
| 266 | + reinterpret_cast<LSSharedFileListItemRef>(login_items_array[i]); |
| 267 | + CFURLRef url_ref = NULL; |
| 268 | + if (LSSharedFileListItemResolve(item, 0, &url_ref, NULL) == noErr && |
| 269 | + item) { |
| 270 | + base::ScopedCFTypeRef<CFURLRef> url(url_ref); |
| 271 | + if ([[base::mac::CFToNSCast(url.get()) path] |
| 272 | + hasPrefix:[[NSBundle mainBundle] bundlePath]]) |
| 273 | + LSSharedFileListItemRemove(list, item); |
| 274 | + } |
| 275 | + } |
| 276 | + } |
| 277 | +} |
| 278 | + |
220 | 279 | void Browser::SetLoginItemSettings(LoginItemSettings settings) { |
221 | 280 | #if defined(MAS_BUILD) |
222 | 281 | platform_util::SetLoginItemEnabled(settings.open_at_login); |
223 | 282 | #else |
224 | 283 | if (settings.open_at_login) |
225 | 284 | base::mac::AddToLoginItems(settings.open_as_hidden); |
226 | | - else |
227 | | - base::mac::RemoveFromLoginItems(); |
| 285 | + else { |
| 286 | + RemoveFromLoginItems(); |
| 287 | + } |
228 | 288 | #endif |
229 | 289 | } |
230 | 290 |
|
|
0 commit comments