Roll WebRTC 5699->5721.
[chromium-blink-merge.git] / ui / base / cocoa / nib_loading.mm
blobdd0eb48d806e1454028ada1c2b738b131d6b61ae
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #import "ui/base/cocoa/nib_loading.h"
7 #include "base/mac/bundle_locations.h"
8 #include "base/mac/scoped_nsobject.h"
10 namespace ui {
12 NSView* GetViewFromNib(NSString* name) {
13   base::scoped_nsobject<NSNib> nib(
14       [[NSNib alloc] initWithNibNamed:name
15                                bundle:base::mac::FrameworkBundle()]);
16   if (!nib)
17     return nil;
19   NSArray* objects;
20   BOOL success = [nib instantiateNibWithOwner:nil
21                               topLevelObjects:&objects];
22   if (!success)
23     return nil;
25   // When loading a nib manually (as opposed to using an NSWindowController or
26   // NSViewController), all the top-level objects need to be explicitly
27   // released. See
28   // http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW10
29   // for more information.
30   [objects makeObjectsPerformSelector:@selector(release)];
32   // For some strange reason, even nibs that appear to have but one top-level
33   // object often have more (an NSApplication, etc.). Filter out what isn't
34   // desired.
35   for (NSView* view in objects) {
36     if (![view isKindOfClass:[NSView class]])
37       continue;
39     return [[view retain] autorelease];
40   }
42   return nil;
45 }  // namespace ui