18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2005, 2008, 2010 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 1. Redistributions of source code must retain the above copyright
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *    notice, this list of conditions and the following disclaimer.
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 2. Redistributions in binary form must reproduce the above copyright
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *    notice, this list of conditions and the following disclaimer in the
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDynamicScrollBarsViewInternal.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDocument.h"
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebFrameInternal.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameView.h"
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebHTMLViewInternal.h"
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/Frame.h>
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/FrameView.h>
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKitSystemInterface.h>
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore;
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: <rdar://problem/5898985> Mail expects a constant of this name to exist.
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int WebCoreScrollbarAlwaysOn = ScrollbarAlwaysOn;
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef __OBJC2__
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// In <rdar://problem/7814899> we saw crashes because WebDynamicScrollBarsView increased in size, breaking ABI compatiblity.
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockCOMPILE_ASSERT(sizeof(WebDynamicScrollBarsView) == 0x8c, WebDynamicScrollBarsView_is_expected_size);
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstruct WebDynamicScrollBarsViewPrivate {
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    unsigned inUpdateScrollersLayoutPass;
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::ScrollbarMode hScroll;
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WebCore::ScrollbarMode vScroll;
51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool hScrollModeLocked;
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool vScrollModeLocked;
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool suppressLayout;
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool suppressScrollers;
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool inUpdateScrollers;
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool verticallyPinnedByPreviousWheelEvent;
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool horizontallyPinnedByPreviousWheelEvent;
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool allowsScrollersToOverlapContent;
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool alwaysHideHorizontalScroller;
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool alwaysHideVerticalScroller;
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool horizontalScrollingAllowedButScrollerHidden;
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool verticalScrollingAllowedButScrollerHidden;
654a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
66f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // scrollOrigin is set for various combinations of writing mode and direction.
67f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // See the comment next to the corresponding member in ScrollView.h.
68f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSPoint scrollOrigin;
694a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
704a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    // Flag to indicate that the scrollbar thumb's initial position needs to
714a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    // be manually set.
72f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bool scrollOriginChanged;
73f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSPoint scrollPositionExcludingOrigin;
744a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
754a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    bool inProgrammaticScroll;
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDynamicScrollBarsView
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (id)initWithFrame:(NSRect)frame
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!(self = [super initWithFrame:frame]))
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return nil;
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _private = new WebDynamicScrollBarsViewPrivate;
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    memset(_private, 0, sizeof(WebDynamicScrollBarsViewPrivate));
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return self;
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (id)initWithCoder:(NSCoder *)aDecoder
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!(self = [super initWithCoder:aDecoder]))
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return nil;
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _private = new WebDynamicScrollBarsViewPrivate;
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    memset(_private, 0, sizeof(WebDynamicScrollBarsViewPrivate));
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return self;
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)dealloc
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    delete _private;
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [super dealloc];
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)finalize
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    delete _private;
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [super finalize];
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setAllowsHorizontalScrolling:(BOOL)flag
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_private->hScrollModeLocked)
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (flag && _private->hScroll == ScrollbarAlwaysOff)
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->hScroll = ScrollbarAuto;
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else if (!flag && _private->hScroll != ScrollbarAlwaysOff)
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->hScroll = ScrollbarAlwaysOff;
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self updateScrollers];
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)setAllowsScrollersToOverlapContent:(BOOL)flag
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_private->allowsScrollersToOverlapContent == flag)
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _private->allowsScrollersToOverlapContent = flag;
129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [[self contentView] setFrame:[self contentViewFrame]];
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [[self documentView] setNeedsLayout:YES];
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [[self documentView] layout];
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)setAlwaysHideHorizontalScroller:(BOOL)shouldBeHidden
136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_private->alwaysHideHorizontalScroller == shouldBeHidden)
138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _private->alwaysHideHorizontalScroller = shouldBeHidden;
141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [self updateScrollers];
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)setAlwaysHideVerticalScroller:(BOOL)shouldBeHidden
145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_private->alwaysHideVerticalScroller == shouldBeHidden)
147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _private->alwaysHideVerticalScroller = shouldBeHidden;
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [self updateScrollers];
151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (BOOL)horizontalScrollingAllowed
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _private->horizontalScrollingAllowedButScrollerHidden || [self hasHorizontalScroller];
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (BOOL)verticalScrollingAllowed
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _private->verticalScrollingAllowedButScrollerHidden || [self hasVerticalScroller];
161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDynamicScrollBarsView (WebInternal)
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (NSRect)contentViewFrame
168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    NSRect frame = [[self contentView] frame];
170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if ([self hasHorizontalScroller])
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        frame.size.height = (_private->allowsScrollersToOverlapContent ? NSMaxY([[self horizontalScroller] frame]) : NSMinY([[self horizontalScroller] frame]));
173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if ([self hasVerticalScroller])
174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        frame.size.width = (_private->allowsScrollersToOverlapContent ? NSMaxX([[self verticalScroller] frame]) : NSMinX([[self verticalScroller] frame]));
175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return frame;
176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)tile
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [super tile];
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // [super tile] sets the contentView size so that it does not overlap with the scrollers,
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // we want to re-set the contentView to overlap scrollers before displaying.
184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_private->allowsScrollersToOverlapContent)
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [[self contentView] setFrame:[self contentViewFrame]];
186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
18806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen- (void)setSuppressLayout:(BOOL)flag
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _private->suppressLayout = flag;
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setScrollBarsSuppressed:(BOOL)suppressed repaintOnUnsuppress:(BOOL)repaint
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _private->suppressScrollers = suppressed;
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This code was originally changes for a Leopard performance imporvement. We decided to
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // ifdef it to fix correctness issues on Tiger documented in <rdar://problem/5441823>.
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (suppressed) {
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[self verticalScroller] setNeedsDisplay:NO];
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[self horizontalScroller] setNeedsDisplay:NO];
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!suppressed && repaint)
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [super reflectScrolledClipView:[self contentView]];
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (suppressed || repaint) {
209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [[self verticalScroller] setNeedsDisplay:!suppressed];
210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [[self horizontalScroller] setNeedsDisplay:!suppressed];
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
215f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (void)adjustForScrollOriginChange
2164a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch{
217f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!_private->scrollOriginChanged)
218f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
2194a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
220f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _private->scrollOriginChanged = false;
221f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
222f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSView *documentView = [self documentView];
223f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSRect documentRect = [documentView bounds];
224f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
225f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // The call to [NSView scrollPoint:] fires off notification the handler for which needs to know that
226f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // we're setting the initial scroll position so it doesn't interpret this as a user action and
227f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // fire off a JS event.
228f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _private->inProgrammaticScroll = true;
229f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [documentView scrollPoint:NSMakePoint(_private->scrollPositionExcludingOrigin.x + documentRect.origin.x, _private->scrollPositionExcludingOrigin.y + documentRect.origin.y)];
230f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _private->inProgrammaticScroll = false;
2314a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch}
2324a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
2330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic const unsigned cMaxUpdateScrollbarsPass = 2;
2340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)updateScrollers
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
237231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    NSView *documentView = [self documentView];
238231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
239231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // If we came in here with the view already needing a layout, then go ahead and do that
240231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // first.  (This will be the common case, e.g., when the page changes due to window resizing for example).
241231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // This layout will not re-enter updateScrollers and does not count towards our max layout pass total.
242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!_private->suppressLayout && !_private->suppressScrollers && [documentView isKindOfClass:[WebHTMLView class]]) {
243231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        WebHTMLView* htmlView = (WebHTMLView*)documentView;
244231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if ([htmlView _needsLayout]) {
245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            _private->inUpdateScrollers = YES;
246231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            [(id <WebDocumentView>)documentView layout];
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            _private->inUpdateScrollers = NO;
248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
249231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
250231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL hasHorizontalScroller = [self hasHorizontalScroller];
252231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    BOOL hasVerticalScroller = [self hasVerticalScroller];
253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    BOOL newHasHorizontalScroller = hasHorizontalScroller;
2550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    BOOL newHasVerticalScroller = hasVerticalScroller;
256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!documentView) {
2580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        newHasHorizontalScroller = NO;
2590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        newHasVerticalScroller = NO;
260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_private->hScroll != ScrollbarAuto)
263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        newHasHorizontalScroller = (_private->hScroll == ScrollbarAlwaysOn);
264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_private->vScroll != ScrollbarAuto)
265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        newHasVerticalScroller = (_private->vScroll == ScrollbarAlwaysOn);
266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!documentView || _private->suppressLayout || _private->suppressScrollers || (_private->hScroll != ScrollbarAuto && _private->vScroll != ScrollbarAuto)) {
268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->horizontalScrollingAllowedButScrollerHidden = newHasHorizontalScroller && _private->alwaysHideHorizontalScroller;
269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (_private->horizontalScrollingAllowedButScrollerHidden)
270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            newHasHorizontalScroller = NO;
271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->verticalScrollingAllowedButScrollerHidden = newHasVerticalScroller && _private->alwaysHideVerticalScroller;
273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (_private->verticalScrollingAllowedButScrollerHidden)
274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            newHasVerticalScroller = NO;
275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->inUpdateScrollers = YES;
2770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (hasHorizontalScroller != newHasHorizontalScroller)
2780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [self setHasHorizontalScroller:newHasHorizontalScroller];
2790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (hasVerticalScroller != newHasVerticalScroller)
2800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [self setHasVerticalScroller:newHasVerticalScroller];
281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (_private->suppressScrollers) {
2820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [[self verticalScroller] setNeedsDisplay:NO];
2830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [[self horizontalScroller] setNeedsDisplay:NO];
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->inUpdateScrollers = NO;
2860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
2870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
289231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    BOOL needsLayout = NO;
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSSize documentSize = [documentView frame].size;
2920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSSize visibleSize = [self documentVisibleRect].size;
2930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSSize frameSize = [self frame].size;
294e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
295e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // When in HiDPI with a scale factor > 1, the visibleSize and frameSize may be non-integral values,
296e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // while the documentSize (set by WebCore) will be integral.  Round up the non-integral sizes so that
297e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // the mismatch won't cause unwanted scrollbars to appear.  This can result in slightly cut off content,
298e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    // but it will always be less than one pixel, which should not be noticeable.
299e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    visibleSize.width = ceilf(visibleSize.width);
300e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    visibleSize.height = ceilf(visibleSize.height);
301e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    frameSize.width = ceilf(frameSize.width);
302e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    frameSize.height = ceilf(frameSize.height);
3030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_private->hScroll == ScrollbarAuto) {
3050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        newHasHorizontalScroller = documentSize.width > visibleSize.width;
306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (newHasHorizontalScroller && !_private->inUpdateScrollersLayoutPass && documentSize.height <= frameSize.height && documentSize.width <= frameSize.width)
3070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            newHasHorizontalScroller = NO;
3080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_private->vScroll == ScrollbarAuto) {
3110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        newHasVerticalScroller = documentSize.height > visibleSize.height;
312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (newHasVerticalScroller && !_private->inUpdateScrollersLayoutPass && documentSize.height <= frameSize.height && documentSize.width <= frameSize.width)
3130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            newHasVerticalScroller = NO;
3140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
3150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Unless in ScrollbarsAlwaysOn mode, if we ever turn one scrollbar off, always turn the other one off too.
3170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Never ever try to both gain/lose a scrollbar in the same pass.
318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!newHasHorizontalScroller && hasHorizontalScroller && _private->vScroll != ScrollbarAlwaysOn)
3190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        newHasVerticalScroller = NO;
320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!newHasVerticalScroller && hasVerticalScroller && _private->hScroll != ScrollbarAlwaysOn)
321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        newHasHorizontalScroller = NO;
322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _private->horizontalScrollingAllowedButScrollerHidden = newHasHorizontalScroller && _private->alwaysHideHorizontalScroller;
324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_private->horizontalScrollingAllowedButScrollerHidden)
3250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        newHasHorizontalScroller = NO;
3260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _private->verticalScrollingAllowedButScrollerHidden = newHasVerticalScroller && _private->alwaysHideVerticalScroller;
328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_private->verticalScrollingAllowedButScrollerHidden)
329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        newHasVerticalScroller = NO;
330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (hasHorizontalScroller != newHasHorizontalScroller) {
332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->inUpdateScrollers = YES;
3330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [self setHasHorizontalScroller:newHasHorizontalScroller];
334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->inUpdateScrollers = NO;
3350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        needsLayout = YES;
336f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        NSView *documentView = [self documentView];
337f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        NSRect documentRect = [documentView bounds];
338f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (documentRect.origin.y < 0 && !newHasHorizontalScroller)
339f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            [documentView setBoundsOrigin:NSMakePoint(documentRect.origin.x, documentRect.origin.y + 15)];
3400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
3410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (hasVerticalScroller != newHasVerticalScroller) {
343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->inUpdateScrollers = YES;
3440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [self setHasVerticalScroller:newHasVerticalScroller];
345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->inUpdateScrollers = NO;
3460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        needsLayout = YES;
347f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        NSView *documentView = [self documentView];
348f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        NSRect documentRect = [documentView bounds];
349f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (documentRect.origin.x < 0 && !newHasVerticalScroller)
350f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            [documentView setBoundsOrigin:NSMakePoint(documentRect.origin.x + 15, documentRect.origin.y)];
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (needsLayout && _private->inUpdateScrollersLayoutPass < cMaxUpdateScrollbarsPass &&
3540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [documentView conformsToProtocol:@protocol(WebDocumentView)]) {
355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->inUpdateScrollersLayoutPass++;
3560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [(id <WebDocumentView>)documentView setNeedsLayout:YES];
3570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [(id <WebDocumentView>)documentView layout];
3580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        NSSize newDocumentSize = [documentView frame].size;
3590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (NSEqualSizes(documentSize, newDocumentSize)) {
3600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // The layout with the new scroll state had no impact on
3610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // the document's overall size, so updateScrollers didn't get called.
3620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // Recur manually.
3630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [self updateScrollers];
3640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->inUpdateScrollersLayoutPass--;
3660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Make the horizontal and vertical scroll bars come and go as needed.
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)reflectScrolledClipView:(NSClipView *)clipView
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (clipView == [self contentView]) {
373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Prevent appearance of trails because of overlapping views
374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (_private->allowsScrollersToOverlapContent)
375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            [self setDrawsBackground:NO];
376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: This hack here prevents infinite recursion that takes place when we
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // gyrate between having a vertical scroller and not having one. A reproducible
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // case is clicking on the "the Policy Routing text" link at
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // http://www.linuxpowered.com/archive/howto/Net-HOWTO-8.html.
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The underlying cause is some problem in the NSText machinery, but I was not
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // able to pin it down.
383231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];
384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!_private->inUpdateScrollers && (!currentContext || [currentContext isDrawingToScreen]))
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [self updateScrollers];
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This code was originally changed for a Leopard performance imporvement. We decided to
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // ifdef it to fix correctness issues on Tiger documented in <rdar://problem/5441823>.
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Update the scrollers if they're not being suppressed.
392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!_private->suppressScrollers)
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [super reflectScrolledClipView:clipView];
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [super reflectScrolledClipView:clipView];
396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Validate the scrollers if they're being suppressed.
398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_private->suppressScrollers) {
399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [[self verticalScroller] setNeedsDisplay:NO];
400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [[self horizontalScroller] setNeedsDisplay:NO];
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4044a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    // The call to [NSView reflectScrolledClipView] sets the scrollbar thumb
4054a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    // position to 0 (the left) when the view is initially displayed.
4064a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    // This call updates the initial position correctly.
407f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [self adjustForScrollOriginChange];
4084a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
4090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(ACCELERATED_COMPOSITING) && defined(BUILDING_ON_LEOPARD)
4100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSView *documentView = [self documentView];
4110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ([documentView isKindOfClass:[WebHTMLView class]]) {
4120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        WebHTMLView *htmlView = (WebHTMLView *)documentView;
4130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ([htmlView _isUsingAcceleratedCompositing])
4140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [htmlView _updateLayerHostingViewPosition];
4150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
4160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)allowsHorizontalScrolling
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
421dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _private->hScroll != ScrollbarAlwaysOff;
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)allowsVerticalScrolling
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
426dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _private->vScroll != ScrollbarAlwaysOff;
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)scrollingModes:(WebCore::ScrollbarMode*)hMode vertical:(WebCore::ScrollbarMode*)vMode
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
431dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    *hMode = _private->hScroll;
432dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    *vMode = _private->vScroll;
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (ScrollbarMode)horizontalScrollingMode
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _private->hScroll;
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (ScrollbarMode)verticalScrollingMode
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
442dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _private->vScroll;
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setHorizontalScrollingMode:(ScrollbarMode)horizontalMode andLock:(BOOL)lock
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setScrollingModes:horizontalMode vertical:[self verticalScrollingMode] andLock:lock];
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setVerticalScrollingMode:(ScrollbarMode)verticalMode andLock:(BOOL)lock
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setScrollingModes:[self horizontalScrollingMode] vertical:verticalMode andLock:lock];
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
455635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// Mail uses this method, so we cannot remove it.
456635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)setVerticalScrollingMode:(ScrollbarMode)verticalMode
457635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
458635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    [self setScrollingModes:[self horizontalScrollingMode] vertical:verticalMode andLock:NO];
459635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
460635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setScrollingModes:(ScrollbarMode)horizontalMode vertical:(ScrollbarMode)verticalMode andLock:(BOOL)lock
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL update = NO;
464dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (verticalMode != _private->vScroll && !_private->vScrollModeLocked) {
465dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->vScroll = verticalMode;
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        update = YES;
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (horizontalMode != _private->hScroll && !_private->hScrollModeLocked) {
470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->hScroll = horizontalMode;
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        update = YES;
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (lock)
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self setScrollingModesLocked:YES];
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (update)
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self updateScrollers];
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setHorizontalScrollingModeLocked:(BOOL)locked
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
483dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _private->hScrollModeLocked = locked;
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setVerticalScrollingModeLocked:(BOOL)locked
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
488dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _private->vScrollModeLocked = locked;
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setScrollingModesLocked:(BOOL)locked
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
493dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _private->hScrollModeLocked = _private->vScrollModeLocked = locked;
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)horizontalScrollingModeLocked
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _private->hScrollModeLocked;
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)verticalScrollingModeLocked
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
503dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return _private->vScrollModeLocked;
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)autoforwardsScrollWheelEvents
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return YES;
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)scrollWheel:(NSEvent *)event
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float deltaX;
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float deltaY;
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL isContinuous;
516545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    WKGetWheelEventDeltas(event, &deltaX, &deltaY, &isContinuous);
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
5192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NSEventPhase momentumPhase = [event momentumPhase];
5202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BOOL isLatchingEvent = momentumPhase & NSEventPhaseBegan || momentumPhase & NSEventPhaseChanged;
5212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#else
5222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    int momentumPhase = WKGetNSEventMomentumPhase(event);
5232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BOOL isLatchingEvent = momentumPhase == WKEventPhaseBegan || momentumPhase == WKEventPhaseChanged;
5242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
525231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (fabsf(deltaY) > fabsf(deltaX)) {
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (![self allowsVerticalScrolling]) {
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [[self nextResponder] scrollWheel:event];
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
531231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (isLatchingEvent && !_private->verticallyPinnedByPreviousWheelEvent) {
533231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            double verticalPosition = [[self verticalScroller] doubleValue];
534231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if ((deltaY >= 0.0 && verticalPosition == 0.0) || (deltaY <= 0.0 && verticalPosition == 1.0))
535231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                return;
536231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
537231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else {
538231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (![self allowsHorizontalScrolling]) {
539231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            [[self nextResponder] scrollWheel:event];
540231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return;
541231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
542231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
543dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (isLatchingEvent && !_private->horizontallyPinnedByPreviousWheelEvent) {
544231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            double horizontalPosition = [[self horizontalScroller] doubleValue];
545231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if ((deltaX >= 0.0 && horizontalPosition == 0.0) || (deltaX <= 0.0 && horizontalPosition == 1.0))
546231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                return;
547231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
550643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Calling super can release the last reference. <rdar://problem/7400263>
551643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Hold a reference so the code following the super call will not crash.
552643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    [self retain];
553643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super scrollWheel:event];
555231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
556231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!isLatchingEvent) {
557231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        double verticalPosition = [[self verticalScroller] doubleValue];
558231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        double horizontalPosition = [[self horizontalScroller] doubleValue];
559231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
560dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->verticallyPinnedByPreviousWheelEvent = (verticalPosition == 0.0 || verticalPosition == 1.0);
561dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _private->horizontallyPinnedByPreviousWheelEvent = (horizontalPosition == 0.0 || horizontalPosition == 1.0);
562231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
563643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
564643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    [self release];
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// This object will be the parent of the web area in WK1, so it should not be ignored.
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)accessibilityIsIgnored
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return NO;
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)setScrollOrigin:(NSPoint)scrollOrigin updatePositionAtAll:(BOOL)updatePositionAtAll immediately:(BOOL)updatePositionSynchronously
5744a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch{
575f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // The cross-platform ScrollView call already checked to see if the old/new scroll origins were the same or not
576f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // so we don't have to check for equivalence here.
577f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _private->scrollOrigin = scrollOrigin;
5784a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch    id docView = [self documentView];
5794a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
580f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSRect visibleRect = [self documentVisibleRect];
581f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
582f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [docView setBoundsOrigin:NSMakePoint(-scrollOrigin.x, -scrollOrigin.y)];
583f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (updatePositionAtAll)
5852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        _private->scrollOriginChanged = true;
586f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
587f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Maintain our original position in the presence of the new scroll origin.
588f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    _private->scrollPositionExcludingOrigin = NSMakePoint(visibleRect.origin.x + scrollOrigin.x, visibleRect.origin.y + scrollOrigin.y);
589f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
5902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (updatePositionAtAll && updatePositionSynchronously) // Otherwise we'll just let the snap happen when we update for the resize.
591f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        [self adjustForScrollOriginChange];
5924a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch}
5934a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
594f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (NSPoint)scrollOrigin
5954a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch{
596f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return _private->scrollOrigin;
5974a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch}
5984a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
59981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch- (BOOL)inProgrammaticScroll
60081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
60181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return _private->inProgrammaticScroll;
60281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
60381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
605