chromium/ios/web_view/internal/cwv_back_forward_list_internal.h

// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_WEB_VIEW_INTERNAL_CWV_BACK_FORWARD_LIST_INTERNAL_H_
#define IOS_WEB_VIEW_INTERNAL_CWV_BACK_FORWARD_LIST_INTERNAL_H_

#import "ios/web_view/public/cwv_back_forward_list.h"

#import "ios/web_view/internal/cwv_back_forward_list_item_internal.h"

NS_ASSUME_NONNULL_BEGIN

namespace web {
class NavigationManager;
}  // namespace web

// This class exists to avoid recreating a new NSArray<CWVBackForwardListItem*>
// when |backForwardList.{back|forward}List| is called. The content of the list
// might silently be changed, so if it were a real array it must be recreated
// every time, which might result in an extra O(n) factor unexpectedly on some
// normal code like this:
//
// list = webView.backForwardList;
// for (i = 0; i < list.backList.count; i++) {
//   <DO SOMETHING WITH list.backList[i]>; // It silently generates a new list.
// }
// And this would be O(n^2) which surely is not something expected.
//
// This class is an array-like wrapper (provides .count and [] operator).
@interface CWVBackForwardListItemArray ()

// The CWVBackForwardList that |self| belongs to.
@property(nonatomic, weak, readonly) CWVBackForwardList* list;

// |self| is backList if |isBackList| == YES, otherwise it is forwardList.
- (instancetype)initWithBackForwardList:(CWVBackForwardList*)list
                             isBackList:(BOOL)isBackList
    NS_DESIGNATED_INITIALIZER;

@end

@interface CWVBackForwardList ()

// The lower-level information provider of backForwardListItem.
@property(nonatomic, nullable) const web::NavigationManager* navigationManager;

// Returns the index of the |item| in the lower level web::NavigationManager.
// -1 means item not found.
- (int)internalIndexOfItem:(CWVBackForwardListItem*)item;

- (instancetype)initWithNavigationManager:
    (const web::NavigationManager*)navigationManager NS_DESIGNATED_INITIALIZER;

@end

NS_ASSUME_NONNULL_END

#endif  // IOS_WEB_VIEW_INTERNAL_CWV_BACK_FORWARD_LIST_INTERNAL_H_