diff options
Diffstat (limited to 'WebKit/mac/History/WebBackForwardList.mm')
-rw-r--r-- | WebKit/mac/History/WebBackForwardList.mm | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/WebKit/mac/History/WebBackForwardList.mm b/WebKit/mac/History/WebBackForwardList.mm new file mode 100644 index 0000000..30767c3 --- /dev/null +++ b/WebKit/mac/History/WebBackForwardList.mm @@ -0,0 +1,281 @@ +/* + * Copyright (C) 2005, 2007 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "WebBackForwardList.h" +#import "WebBackForwardListInternal.h" + +#import "WebFrameInternal.h" +#import "WebHistoryItemInternal.h" +#import "WebHistoryItemPrivate.h" +#import "WebKitLogging.h" +#import "WebNSObjectExtras.h" +#import "WebPreferencesPrivate.h" +#import "WebTypesInternal.h" +#import "WebViewPrivate.h" +#import <WebCore/BackForwardList.h> +#import <WebCore/HistoryItem.h> +#import <WebCore/Page.h> +#import <WebCore/PageCache.h> +#import <WebCore/Settings.h> +#import <WebCore/ThreadCheck.h> +#import <WebCore/WebCoreObjCExtras.h> +#import <wtf/Assertions.h> +#import <wtf/RetainPtr.h> + +using namespace WebCore; + +static HashMap<BackForwardList*, WebBackForwardList*>& backForwardLists() +{ + static HashMap<BackForwardList*, WebBackForwardList*> staticBackForwardLists; + return staticBackForwardLists; +} + +@implementation WebBackForwardList (WebBackForwardListInternal) + +BackForwardList* core(WebBackForwardList *webBackForwardList) +{ + if (!webBackForwardList) + return 0; + + return reinterpret_cast<BackForwardList*>(webBackForwardList->_private); +} + +WebBackForwardList *kit(BackForwardList* backForwardList) +{ + if (!backForwardList) + return nil; + + if (WebBackForwardList *webBackForwardList = backForwardLists().get(backForwardList)) + return webBackForwardList; + + return [[[WebBackForwardList alloc] initWithBackForwardList:backForwardList] autorelease]; +} + +- (id)initWithBackForwardList:(PassRefPtr<BackForwardList>)backForwardList +{ + WebCoreThreadViolationCheck(); + self = [super init]; + if (!self) + return nil; + + _private = reinterpret_cast<WebBackForwardListPrivate*>(backForwardList.releaseRef()); + backForwardLists().set(core(self), self); + return self; +} + +@end + +@implementation WebBackForwardList + +#ifndef BUILDING_ON_TIGER ++ (void)initialize +{ + WebCoreObjCFinalizeOnMainThread(self); +} +#endif + +- (id)init +{ + return [self initWithBackForwardList:BackForwardList::create(0)]; +} + +- (void)dealloc +{ + if (WebCoreObjCScheduleDeallocateOnMainThread([WebBackForwardList class], self)) + return; + + BackForwardList* backForwardList = core(self); + ASSERT(backForwardList->closed()); + backForwardLists().remove(backForwardList); + backForwardList->deref(); + + [super dealloc]; +} + +- (void)finalize +{ + WebCoreThreadViolationCheck(); + BackForwardList* backForwardList = core(self); + ASSERT(backForwardList->closed()); + backForwardLists().remove(backForwardList); + backForwardList->deref(); + + [super finalize]; +} + +- (void)_close +{ + core(self)->close(); +} + +- (void)addItem:(WebHistoryItem *)entry; +{ + core(self)->addItem(core(entry)); + + // Since the assumed contract with WebBackForwardList is that it retains its WebHistoryItems, + // the following line prevents a whole class of problems where a history item will be created in + // a function, added to the BFlist, then used in the rest of that function. + [[entry retain] autorelease]; +} + +- (void)removeItem:(WebHistoryItem *)item +{ + core(self)->removeItem(core(item)); +} + +- (BOOL)containsItem:(WebHistoryItem *)item +{ + return core(self)->containsItem(core(item)); +} + +- (void)goBack +{ + core(self)->goBack(); +} + +- (void)goForward +{ + core(self)->goForward(); +} + +- (void)goToItem:(WebHistoryItem *)item +{ + core(self)->goToItem(core(item)); +} + +- (WebHistoryItem *)backItem +{ + return [[kit(core(self)->backItem()) retain] autorelease]; +} + +- (WebHistoryItem *)currentItem +{ + return [[kit(core(self)->currentItem()) retain] autorelease]; +} + +- (WebHistoryItem *)forwardItem +{ + return [[kit(core(self)->forwardItem()) retain] autorelease]; +} + +static NSArray* vectorToNSArray(HistoryItemVector& list) +{ + unsigned size = list.size(); + NSMutableArray *result = [[[NSMutableArray alloc] initWithCapacity:size] autorelease]; + for (unsigned i = 0; i < size; ++i) + [result addObject:kit(list[i].get())]; + + return result; +} + +- (NSArray *)backListWithLimit:(int)limit; +{ + HistoryItemVector list; + core(self)->backListWithLimit(limit, list); + return vectorToNSArray(list); +} + +- (NSArray *)forwardListWithLimit:(int)limit; +{ + HistoryItemVector list; + core(self)->forwardListWithLimit(limit, list); + return vectorToNSArray(list); +} + +- (int)capacity +{ + return core(self)->capacity(); +} + +- (void)setCapacity:(int)size +{ + core(self)->setCapacity(size); +} + + +-(NSString *)description +{ + NSMutableString *result; + + result = [NSMutableString stringWithCapacity:512]; + + [result appendString:@"\n--------------------------------------------\n"]; + [result appendString:@"WebBackForwardList:\n"]; + + BackForwardList* backForwardList = core(self); + HistoryItemVector& entries = backForwardList->entries(); + + unsigned size = entries.size(); + for (unsigned i = 0; i < size; ++i) { + if (entries[i] == backForwardList->currentItem()) { + [result appendString:@" >>>"]; + } else { + [result appendString:@" "]; + } + [result appendFormat:@"%2d) ", i]; + int currPos = [result length]; + [result appendString:[kit(entries[i].get()) description]]; + + // shift all the contents over. a bit slow, but this is for debugging + NSRange replRange = {currPos, [result length]-currPos}; + [result replaceOccurrencesOfString:@"\n" withString:@"\n " options:0 range:replRange]; + + [result appendString:@"\n"]; + } + + [result appendString:@"\n--------------------------------------------\n"]; + + return result; +} + +- (void)setPageCacheSize:(NSUInteger)size +{ + [kit(core(self)->page()) setUsesPageCache:size != 0]; +} + +- (NSUInteger)pageCacheSize +{ + return [kit(core(self)->page()) usesPageCache] ? pageCache()->capacity() : 0; +} + +- (int)backListCount +{ + return core(self)->backListCount(); +} + +- (int)forwardListCount +{ + return core(self)->forwardListCount(); +} + +- (WebHistoryItem *)itemAtIndex:(int)index +{ + return [[kit(core(self)->itemAtIndex(index)) retain] autorelease]; +} + +@end |