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