📄 webhistoryitem.mm
字号:
{ core(_private)->setViewState(statePList);}- (void)_mergeAutoCompleteHints:(WebHistoryItem *)otherItem{ ASSERT_ARG(otherItem, otherItem); core(_private)->mergeAutoCompleteHints(core(otherItem->_private));}- (id)initFromDictionaryRepresentation:(NSDictionary *)dict{ ASSERT_MAIN_THREAD(); NSString *URLString = [dict _webkit_stringForKey:@""]; NSString *title = [dict _webkit_stringForKey:titleKey]; // Do an existence check to avoid calling doubleValue on a nil string. Leave // time interval at 0 if there's no value in dict. NSString *timeIntervalString = [dict _webkit_stringForKey:lastVisitedTimeIntervalKey]; NSTimeInterval lastVisited = timeIntervalString == nil ? 0 : [timeIntervalString doubleValue]; self = [self initWithURLString:URLString title:title displayTitle:[dict _webkit_stringForKey:displayTitleKey] lastVisitedTimeInterval:lastVisited]; // Check if we've read a broken URL from the file that has non-Latin1 chars. If so, try to convert // as if it was from user typing. if (![URLString canBeConvertedToEncoding:NSISOLatin1StringEncoding]) { NSURL *tempURL = [NSURL _web_URLWithUserTypedString:URLString]; ASSERT(tempURL); NSString *newURLString = [tempURL _web_originalDataAsString]; core(_private)->setURLString(newURLString); core(_private)->setOriginalURLString(newURLString); } int visitCount = [dict _webkit_intForKey:visitCountKey]; // Can't trust data on disk, and we've had at least one report of this (<rdar://6572300>). if (visitCount < 0) { LOG_ERROR("visit count for history item \"%@\" is negative (%d), will be reset to 1", URLString, visitCount); visitCount = 1; } core(_private)->setVisitCount(visitCount); if ([dict _webkit_boolForKey:lastVisitWasFailureKey]) core(_private)->setLastVisitWasFailure(true); BOOL lastVisitWasHTTPNonGet = [dict _webkit_boolForKey:lastVisitWasHTTPNonGetKey]; NSString *tempURLString = [URLString lowercaseString]; if (lastVisitWasHTTPNonGet && ([tempURLString hasPrefix:@"http:"] || [tempURLString hasPrefix:@"https:"])) core(_private)->setLastVisitWasHTTPNonGet(lastVisitWasHTTPNonGet); if (NSArray *redirectURLs = [dict _webkit_arrayForKey:redirectURLsKey]) { NSUInteger size = [redirectURLs count]; std::auto_ptr<Vector<String> > redirectURLsVector(new Vector<String>(size)); for (NSUInteger i = 0; i < size; ++i) (*redirectURLsVector)[i] = String([redirectURLs _webkit_stringAtIndex:i]); core(_private)->setRedirectURLs(redirectURLsVector); } NSArray *dailyCounts = [dict _webkit_arrayForKey:dailyVisitCountKey]; NSArray *weeklyCounts = [dict _webkit_arrayForKey:weeklyVisitCountKey]; if (dailyCounts || weeklyCounts) { Vector<int> coreDailyCounts([dailyCounts count]); Vector<int> coreWeeklyCounts([weeklyCounts count]); // Daily and weekly counts < 0 are errors in the data read from disk, so reset to 0. for (size_t i = 0; i < coreDailyCounts.size(); ++i) coreDailyCounts[i] = max([[dailyCounts _webkit_numberAtIndex:i] intValue], 0); for (size_t i = 0; i < coreWeeklyCounts.size(); ++i) coreWeeklyCounts[i] = max([[weeklyCounts _webkit_numberAtIndex:i] intValue], 0); core(_private)->adoptVisitCounts(coreDailyCounts, coreWeeklyCounts); } NSArray *childDicts = [dict objectForKey:childrenKey]; if (childDicts) { for (int i = [childDicts count] - 1; i >= 0; i--) { WebHistoryItem *child = [[WebHistoryItem alloc] initFromDictionaryRepresentation:[childDicts objectAtIndex:i]]; core(_private)->addChildItem(core(child->_private)); [child release]; } } return self;}- (NSPoint)scrollPoint{ ASSERT_MAIN_THREAD(); return core(_private)->scrollPoint();}- (void)_visitedWithTitle:(NSString *)title{ core(_private)->visited(title, [NSDate timeIntervalSinceReferenceDate]);}- (void)_recordInitialVisit{ core(_private)->recordInitialVisit();}@end@implementation WebHistoryItem (WebPrivate)- (id)initWithURL:(NSURL *)URL title:(NSString *)title{ return [self initWithURLString:[URL _web_originalDataAsString] title:title lastVisitedTimeInterval:0];}- (NSDictionary *)dictionaryRepresentation{ ASSERT_MAIN_THREAD(); NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:8]; HistoryItem* coreItem = core(_private); if (!coreItem->urlString().isEmpty()) [dict setObject:(NSString*)coreItem->urlString() forKey:@""]; if (!coreItem->title().isEmpty()) [dict setObject:(NSString*)coreItem->title() forKey:titleKey]; if (!coreItem->alternateTitle().isEmpty()) [dict setObject:(NSString*)coreItem->alternateTitle() forKey:displayTitleKey]; if (coreItem->lastVisitedTime() != 0.0) { // Store as a string to maintain backward compatibility. (See 3245793) [dict setObject:[NSString stringWithFormat:@"%.1lf", coreItem->lastVisitedTime()] forKey:lastVisitedTimeIntervalKey]; } if (coreItem->visitCount()) [dict setObject:[NSNumber numberWithInt:coreItem->visitCount()] forKey:visitCountKey]; if (coreItem->lastVisitWasFailure()) [dict setObject:[NSNumber numberWithBool:YES] forKey:lastVisitWasFailureKey]; if (coreItem->lastVisitWasHTTPNonGet()) { ASSERT(coreItem->urlString().startsWith("http:", false) || coreItem->urlString().startsWith("https:", false)); [dict setObject:[NSNumber numberWithBool:YES] forKey:lastVisitWasHTTPNonGetKey]; } if (Vector<String>* redirectURLs = coreItem->redirectURLs()) { size_t size = redirectURLs->size(); ASSERT(size); NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:size]; for (size_t i = 0; i < size; ++i) [result addObject:(NSString*)redirectURLs->at(i)]; [dict setObject:result forKey:redirectURLsKey]; [result release]; } const Vector<int>& dailyVisitCounts = coreItem->dailyVisitCounts(); if (dailyVisitCounts.size()) { NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:13]; for (size_t i = 0; i < dailyVisitCounts.size(); ++i) [array addObject:[NSNumber numberWithInt:dailyVisitCounts[i]]]; [dict setObject:array forKey:dailyVisitCountKey]; [array release]; } const Vector<int>& weeklyVisitCounts = coreItem->weeklyVisitCounts(); if (weeklyVisitCounts.size()) { NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:5]; for (size_t i = 0; i < weeklyVisitCounts.size(); ++i) [array addObject:[NSNumber numberWithInt:weeklyVisitCounts[i]]]; [dict setObject:array forKey:weeklyVisitCountKey]; [array release]; } if (coreItem->children().size()) { const HistoryItemVector& children = coreItem->children(); NSMutableArray *childDicts = [NSMutableArray arrayWithCapacity:children.size()]; for (int i = children.size() - 1; i >= 0; i--) [childDicts addObject:[kit(children[i].get()) dictionaryRepresentation]]; [dict setObject: childDicts forKey:childrenKey]; } return dict;}- (NSString *)target{ ASSERT_MAIN_THREAD(); return nsStringNilIfEmpty(core(_private)->target());}- (BOOL)isTargetItem{ return core(_private)->isTargetItem();}- (int)visitCount{ ASSERT_MAIN_THREAD(); return core(_private)->visitCount();}- (NSString *)RSSFeedReferrer{ return nsStringNilIfEmpty(core(_private)->referrer());}- (void)setRSSFeedReferrer:(NSString *)referrer{ core(_private)->setReferrer(referrer);}- (NSArray *)children{ ASSERT_MAIN_THREAD(); const HistoryItemVector& children = core(_private)->children(); if (!children.size()) return nil; unsigned size = children.size(); NSMutableArray *result = [[[NSMutableArray alloc] initWithCapacity:size] autorelease]; for (unsigned i = 0; i < size; ++i) [result addObject:kit(children[i].get())]; return result;}- (void)setAlwaysAttemptToUsePageCache:(BOOL)flag{ // Safari 2.0 uses this for SnapBack, so we stub it out to avoid a crash.}- (NSURL *)URL{ ASSERT_MAIN_THREAD(); const KURL& url = core(_private)->url(); if (url.isEmpty()) return nil; return url;}// This should not be called directly for WebHistoryItems that are already included// in WebHistory. Use -[WebHistory setLastVisitedTimeInterval:forItem:] instead.- (void)_setLastVisitedTimeInterval:(NSTimeInterval)time{ core(_private)->setLastVisitedTime(time);}// FIXME: <rdar://problem/4880065> - Push Global History into WebCore// Once that task is complete, this accessor can go away- (NSCalendarDate *)_lastVisitedDate{ ASSERT_MAIN_THREAD(); return [[[NSCalendarDate alloc] initWithTimeIntervalSinceReferenceDate:core(_private)->lastVisitedTime()] autorelease];}- (WebHistoryItem *)targetItem{ ASSERT_MAIN_THREAD(); HistoryItem* coreItem = core(_private); if (coreItem->isTargetItem() || !coreItem->hasChildren()) return self; return kit(coreItem->recurseToFindTargetItem());}+ (void)_releaseAllPendingPageCaches{ pageCache()->releaseAutoreleasedPagesNow();}- (id)_transientPropertyForKey:(NSString *)key{ return core(_private)->getTransientProperty(key);}- (void)_setTransientProperty:(id)property forKey:(NSString *)key{ core(_private)->setTransientProperty(key, property);}- (BOOL)lastVisitWasFailure{ return core(_private)->lastVisitWasFailure();}- (void)_setLastVisitWasFailure:(BOOL)failure{ core(_private)->setLastVisitWasFailure(failure);}- (BOOL)_lastVisitWasHTTPNonGet{ return core(_private)->lastVisitWasHTTPNonGet();}- (NSArray *)_redirectURLs{ Vector<String>* redirectURLs = core(_private)->redirectURLs(); if (!redirectURLs) return nil; size_t size = redirectURLs->size(); ASSERT(size); NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:size]; for (size_t i = 0; i < size; ++i) [result addObject:(NSString*)redirectURLs->at(i)]; return [result autorelease];}- (size_t)_getDailyVisitCounts:(const int**)counts{ HistoryItem* coreItem = core(_private); *counts = coreItem->dailyVisitCounts().data(); return coreItem->dailyVisitCounts().size();}- (size_t)_getWeeklyVisitCounts:(const int**)counts{ HistoryItem* coreItem = core(_private); *counts = coreItem->weeklyVisitCounts().data(); return coreItem->weeklyVisitCounts().size();}@end// FIXME: <rdar://problem/4886761>// This is a bizarre policy - we flush the page caches ANY time ANY window is closed? @implementation WebWindowWatcher-(void)windowWillClose:(NSNotification *)notification{ pageCache()->releaseAutoreleasedPagesNow();}@end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -