| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2010 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. | |
| 4 | |
| 5 #import "chrome/browser/ui/cocoa/options/custom_home_pages_model.h" | |
| 6 | |
| 7 #include "base/sys_string_conversions.h" | |
| 8 #include "chrome/browser/net/url_fixer_upper.h" | |
| 9 #include "chrome/browser/prefs/session_startup_pref.h" | |
| 10 | |
| 11 NSString* const kHomepageEntryChangedNotification = | |
| 12 @"kHomepageEntryChangedNotification"; | |
| 13 | |
| 14 @interface CustomHomePagesModel (Private) | |
| 15 - (void)setURLsInternal:(const std::vector<GURL>&)urls; | |
| 16 @end | |
| 17 | |
| 18 @implementation CustomHomePagesModel | |
| 19 | |
| 20 - (id)initWithProfile:(Profile*)profile { | |
| 21 if ((self = [super init])) { | |
| 22 profile_ = profile; | |
| 23 entries_.reset([[NSMutableArray alloc] init]); | |
| 24 } | |
| 25 return self; | |
| 26 } | |
| 27 | |
| 28 - (NSUInteger)countOfCustomHomePages { | |
| 29 return [entries_ count]; | |
| 30 } | |
| 31 | |
| 32 - (id)objectInCustomHomePagesAtIndex:(NSUInteger)index { | |
| 33 return [entries_ objectAtIndex:index]; | |
| 34 } | |
| 35 | |
| 36 - (void)insertObject:(id)object inCustomHomePagesAtIndex:(NSUInteger)index { | |
| 37 [entries_ insertObject:object atIndex:index]; | |
| 38 } | |
| 39 | |
| 40 - (void)removeObjectFromCustomHomePagesAtIndex:(NSUInteger)index { | |
| 41 [entries_ removeObjectAtIndex:index]; | |
| 42 // Force a save. | |
| 43 [self validateURLs]; | |
| 44 } | |
| 45 | |
| 46 // Get/set the urls the model currently contains as a group. These will weed | |
| 47 // out any URLs that are empty and not add them to the model. As a result, | |
| 48 // the next time they're persisted to the prefs backend, they'll disappear. | |
| 49 - (std::vector<GURL>)URLs { | |
| 50 std::vector<GURL> urls; | |
| 51 for (CustomHomePageEntry* entry in entries_.get()) { | |
| 52 const char* urlString = [[entry URL] UTF8String]; | |
| 53 if (urlString && std::strlen(urlString)) { | |
| 54 urls.push_back(GURL(std::string(urlString))); | |
| 55 } | |
| 56 } | |
| 57 return urls; | |
| 58 } | |
| 59 | |
| 60 - (void)setURLs:(const std::vector<GURL>&)urls { | |
| 61 [self willChangeValueForKey:@"customHomePages"]; | |
| 62 [self setURLsInternal:urls]; | |
| 63 SessionStartupPref pref(SessionStartupPref::GetStartupPref(profile_)); | |
| 64 pref.urls = urls; | |
| 65 SessionStartupPref::SetStartupPref(profile_, pref); | |
| 66 [self didChangeValueForKey:@"customHomePages"]; | |
| 67 } | |
| 68 | |
| 69 // Converts the C++ URLs to Cocoa objects without notifying KVO. | |
| 70 - (void)setURLsInternal:(const std::vector<GURL>&)urls { | |
| 71 [entries_ removeAllObjects]; | |
| 72 for (size_t i = 0; i < urls.size(); ++i) { | |
| 73 scoped_nsobject<CustomHomePageEntry> entry( | |
| 74 [[CustomHomePageEntry alloc] init]); | |
| 75 const char* urlString = urls[i].spec().c_str(); | |
| 76 if (urlString && std::strlen(urlString)) { | |
| 77 [entry setURL:[NSString stringWithCString:urlString | |
| 78 encoding:NSUTF8StringEncoding]]; | |
| 79 [entries_ addObject:entry]; | |
| 80 } | |
| 81 } | |
| 82 } | |
| 83 | |
| 84 - (void)reloadURLs { | |
| 85 [self willChangeValueForKey:@"customHomePages"]; | |
| 86 SessionStartupPref pref(SessionStartupPref::GetStartupPref(profile_)); | |
| 87 [self setURLsInternal:pref.urls]; | |
| 88 [self didChangeValueForKey:@"customHomePages"]; | |
| 89 } | |
| 90 | |
| 91 - (void)validateURLs { | |
| 92 [self setURLs:[self URLs]]; | |
| 93 } | |
| 94 | |
| 95 - (void)setURLStringEmptyAt:(NSUInteger)index { | |
| 96 // This replaces the data at |index| with an empty (invalid) URL string. | |
| 97 CustomHomePageEntry* entry = [entries_ objectAtIndex:index]; | |
| 98 [entry setURL:[NSString stringWithString:@""]]; | |
| 99 } | |
| 100 | |
| 101 @end | |
| 102 | |
| 103 //--------------------------------------------------------------------------- | |
| 104 | |
| 105 @implementation CustomHomePageEntry | |
| 106 | |
| 107 - (void)setURL:(NSString*)url { | |
| 108 // |url| can be nil if the user cleared the text from the edit field. | |
| 109 if (!url) | |
| 110 url = [NSString stringWithString:@""]; | |
| 111 | |
| 112 // Make sure the url is valid before setting it by fixing it up. | |
| 113 std::string fixedUrl(URLFixerUpper::FixupURL( | |
| 114 base::SysNSStringToUTF8(url), std::string()).possibly_invalid_spec()); | |
| 115 url_.reset([base::SysUTF8ToNSString(fixedUrl) retain]); | |
| 116 | |
| 117 // Broadcast that an individual item has changed. | |
| 118 [[NSNotificationCenter defaultCenter] | |
| 119 postNotificationName:kHomepageEntryChangedNotification object:nil]; | |
| 120 | |
| 121 // TODO(pinkerton): fetch favicon, convert to NSImage http://crbug.com/34642 | |
| 122 } | |
| 123 | |
| 124 - (NSString*)URL { | |
| 125 return url_.get(); | |
| 126 } | |
| 127 | |
| 128 - (void)setImage:(NSImage*)image { | |
| 129 icon_.reset(image); | |
| 130 } | |
| 131 | |
| 132 - (NSImage*)image { | |
| 133 return icon_.get(); | |
| 134 } | |
| 135 | |
| 136 - (NSString*)description { | |
| 137 return url_.get(); | |
| 138 } | |
| 139 | |
| 140 @end | |
| OLD | NEW |