⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webhistoryitem.mm

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 MM
📖 第 1 页 / 共 2 页
字号:
{    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 + -