18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005 Apple Computer, 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:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebClipView.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3121939df44de1705786c545cd1bf519d47250322dBen Murdoch#import "WebFrameInternal.h"
3221939df44de1705786c545cd1bf519d47250322dBen Murdoch#import "WebFrameView.h"
3321939df44de1705786c545cd1bf519d47250322dBen Murdoch#import "WebViewPrivate.h"
3421939df44de1705786c545cd1bf519d47250322dBen Murdoch#import <WebCore/FrameView.h>
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// WebClipView's entire reason for existing is to set the clip used by focus ring redrawing.
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// There's no easy way to prevent the focus ring from drawing outside the passed-in clip rectangle
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// because it expects to have to draw outside the bounds of the view it's being drawn for.
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// But it looks for the enclosing clip view, which gives us a hook we can use to control it.
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The "additional clip" is a clip for focus ring redrawing.
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: Change terminology from "additional clip" to "focus ring clip".
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4421939df44de1705786c545cd1bf519d47250322dBen Murdochusing namespace WebCore;
4521939df44de1705786c545cd1bf519d47250322dBen Murdoch
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSView (WebViewMethod)
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebView *)_webView;
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5021939df44de1705786c545cd1bf519d47250322dBen Murdoch@interface NSClipView (WebNSClipViewDetails)
5121939df44de1705786c545cd1bf519d47250322dBen Murdoch- (void)_immediateScrollToPoint:(NSPoint)newOrigin;
5221939df44de1705786c545cd1bf519d47250322dBen Murdoch@end
5321939df44de1705786c545cd1bf519d47250322dBen Murdoch
542bde8e466a4451c7319e3a072d118917957d6554Steve Block#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
552bde8e466a4451c7319e3a072d118917957d6554Steve Block@interface NSWindow (WebNSWindowDetails)
562bde8e466a4451c7319e3a072d118917957d6554Steve Block- (void)_disableDelayedWindowDisplay;
572bde8e466a4451c7319e3a072d118917957d6554Steve Block- (void)_enableDelayedWindowDisplay;
582bde8e466a4451c7319e3a072d118917957d6554Steve Block@end
592bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
602bde8e466a4451c7319e3a072d118917957d6554Steve Block
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebClipView
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithFrame:(NSRect)frame
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super initWithFrame:frame];
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self)
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // In WebHTMLView, we set a clip. This is not typical to do in an
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // NSView, and while correct for any one invocation of drawRect:,
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // it causes some bad problems if that clip is cached between calls.
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The cached graphics state, which clip views keep around, does
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // cache the clip in this undesirable way. Consequently, we want to
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // release the GState for all clip views for all views contained in
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // a WebHTMLView. Here we do it for subframes, which use WebClipView.
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // See these bugs for more information:
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // <rdar://problem/3409315>: REGRESSSION (7B58-7B60)?: Safari draws blank frames on macosx.apple.com perf page
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self releaseGState];
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8321939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(ACCELERATED_COMPOSITING)
8421939df44de1705786c545cd1bf519d47250322dBen Murdoch- (NSRect)visibleRect
8521939df44de1705786c545cd1bf519d47250322dBen Murdoch{
8621939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!_isScrolling)
8721939df44de1705786c545cd1bf519d47250322dBen Murdoch        return [super visibleRect];
8821939df44de1705786c545cd1bf519d47250322dBen Murdoch
8921939df44de1705786c545cd1bf519d47250322dBen Murdoch    WebFrameView *webFrameView = (WebFrameView *)[[self superview] superview];
9021939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (![webFrameView isKindOfClass:[WebFrameView class]])
9121939df44de1705786c545cd1bf519d47250322dBen Murdoch        return [super visibleRect];
9221939df44de1705786c545cd1bf519d47250322dBen Murdoch
9321939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (Frame* coreFrame = core([webFrameView webFrame])) {
9421939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (FrameView* frameView = coreFrame->view()) {
9521939df44de1705786c545cd1bf519d47250322dBen Murdoch            if (frameView->isEnclosedInCompositingLayer())
9621939df44de1705786c545cd1bf519d47250322dBen Murdoch                return [self bounds];
9721939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
9821939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
9921939df44de1705786c545cd1bf519d47250322dBen Murdoch
10021939df44de1705786c545cd1bf519d47250322dBen Murdoch    return [super visibleRect];
10121939df44de1705786c545cd1bf519d47250322dBen Murdoch}
10221939df44de1705786c545cd1bf519d47250322dBen Murdoch
10321939df44de1705786c545cd1bf519d47250322dBen Murdoch- (void)_immediateScrollToPoint:(NSPoint)newOrigin
10421939df44de1705786c545cd1bf519d47250322dBen Murdoch{
10521939df44de1705786c545cd1bf519d47250322dBen Murdoch    _isScrolling = YES;
1062bde8e466a4451c7319e3a072d118917957d6554Steve Block
1072bde8e466a4451c7319e3a072d118917957d6554Steve Block#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
1082bde8e466a4451c7319e3a072d118917957d6554Steve Block    [[self window] _disableDelayedWindowDisplay];
1092bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
1102bde8e466a4451c7319e3a072d118917957d6554Steve Block
11121939df44de1705786c545cd1bf519d47250322dBen Murdoch    [super _immediateScrollToPoint:newOrigin];
1122bde8e466a4451c7319e3a072d118917957d6554Steve Block
1132bde8e466a4451c7319e3a072d118917957d6554Steve Block#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
1142bde8e466a4451c7319e3a072d118917957d6554Steve Block    [[self window] _enableDelayedWindowDisplay];
1152bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
1162bde8e466a4451c7319e3a072d118917957d6554Steve Block
11721939df44de1705786c545cd1bf519d47250322dBen Murdoch    _isScrolling = NO;
11821939df44de1705786c545cd1bf519d47250322dBen Murdoch}
11921939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
12021939df44de1705786c545cd1bf519d47250322dBen Murdoch
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)resetAdditionalClip
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(_haveAdditionalClip);
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _haveAdditionalClip = NO;
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setAdditionalClip:(NSRect)additionalClip
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!_haveAdditionalClip);
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _haveAdditionalClip = YES;
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _additionalClip = additionalClip;
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)hasAdditionalClip
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _haveAdditionalClip;
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSRect)additionalClip
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(_haveAdditionalClip);
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _additionalClip;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSRect)_focusRingVisibleRect
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRect rect = [self visibleRect];
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_haveAdditionalClip) {
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        rect = NSIntersectionRect(rect, _additionalClip);
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return rect;
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)scrollWheel:(NSEvent *)event
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView *docView = [self documentView];
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([docView respondsToSelector:@selector(_webView)]) {
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebView *wv = [docView _webView];
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([wv _dashboardBehavior:WebDashboardBehaviorAllowWheelScrolling]) {
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [super scrollWheel:event];
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super scrollWheel:event];
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
170