blob: 1204ac640a28258e57f12493691235a674aa58e3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
// Copyright (c) 2009 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.
#import "chrome/browser/cocoa/custom_home_pages_model.h"
#include "base/sys_string_conversions.h"
#include "chrome/browser/history/history.h"
#include "chrome/browser/net/url_fixer_upper.h"
NSString* const kHomepageEntryChangedNotification =
@"kHomepageEntryChangedNotification";
// An entry representing a single item in the custom home page model. Stores
// a url and a favicon.
@interface CustomHomePageEntry : NSObject {
@private
scoped_nsobject<NSString> url_;
scoped_nsobject<NSImage> icon_;
// If non-zero, indicates we're loading the favicon for the page.
HistoryService::Handle icon_handle_;
}
@property(nonatomic, copy) NSString* URL;
@property(nonatomic, retain) NSImage* image;
@end
//----------------------------------------------------------------------------
@implementation CustomHomePagesModel
- (id)initWithProfile:(Profile*)profile {
if ((self = [super init])) {
profile_ = profile;
entries_.reset([[NSMutableArray alloc] init]);
}
return self;
}
- (NSUInteger)countOfCustomHomePages {
return [entries_ count];
}
- (id)objectInCustomHomePagesAtIndex:(NSUInteger)index {
return [entries_ objectAtIndex:index];
}
- (void)insertObject:(id)object inCustomHomePagesAtIndex:(NSUInteger)index {
[entries_ insertObject:object atIndex:index];
}
- (void)removeObjectFromCustomHomePagesAtIndex:(NSUInteger)index {
[entries_ removeObjectAtIndex:index];
}
// Get/set the urls the model currently contains as a group. These will weed
// out any URLs that are empty and not add them to the model. As a result,
// the next time they're persisted to the prefs backend, they'll disappear.
- (std::vector<GURL>)URLs {
std::vector<GURL> urls;
for (CustomHomePageEntry* entry in entries_.get()) {
const char* urlString = [[entry URL] UTF8String];
if (urlString && std::strlen(urlString)) {
urls.push_back(GURL(std::string(urlString)));
}
}
return urls;
}
- (void)setURLs:(const std::vector<GURL>&)urls {
[self willChangeValueForKey:@"customHomePages"];
[entries_ removeAllObjects];
for (size_t i = 0; i < urls.size(); ++i) {
scoped_nsobject<CustomHomePageEntry> entry(
[[CustomHomePageEntry alloc] init]);
const char* urlString = urls[i].spec().c_str();
if (urlString && std::strlen(urlString)) {
[entry setURL:[NSString stringWithCString:urlString
encoding:NSUTF8StringEncoding]];
[entries_ addObject:entry];
}
}
[self didChangeValueForKey:@"customHomePages"];
}
@end
//---------------------------------------------------------------------------
@implementation CustomHomePageEntry
- (void)setURL:(NSString*)url {
// Make sure the url is valid before setting it by fixing it up.
std::string urlToFix(base::SysNSStringToUTF8(url));
urlToFix = URLFixerUpper::FixupURL(urlToFix, "");
url_.reset([base::SysUTF8ToNSString(urlToFix) retain]);
// Broadcast that an individual item has changed.
[[NSNotificationCenter defaultCenter]
postNotificationName:kHomepageEntryChangedNotification object:nil];
// TODO(pinkerton): fetch favicon, convert to NSImage
}
- (NSString*)URL {
return url_.get();
}
- (void)setImage:(NSImage*)image {
icon_.reset(image);
}
- (NSImage*)image {
return icon_.get();
}
@end
|