WidgetMac.mm revision 65f03d4f644ce73618e5f4f50dd694b26f55ae12
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2004, 2005, 2006, 2008, 2010, 2011 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:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "config.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "Widget.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef BUILDING_ON_TIGER
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "AutodrainedPool.h"
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "BlockExceptions.h"
34d0825bca7fe65beaee391d30da42e937db621564Steve Block#import "Chrome.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "Cursor.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "Document.h"
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "FloatConversion.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "Font.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "Frame.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "GraphicsContext.h"
41d0825bca7fe65beaee391d30da42e937db621564Steve Block#import "NotImplemented.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "Page.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "PlatformMouseEvent.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "ScrollView.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebCoreFrameView.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebCoreView.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/RetainPtr.h>
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSWindow (WebWindowDetails)
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_needsToResetDragMargins;
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setNeedsToResetDragMargins:(BOOL)needs;
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSView (WebSetSelectedMethods)
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setIsSelected:(BOOL)isSelected;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)webPlugInSetIsSelected:(BOOL)isSelected;
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@interface NSView (Widget)
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)visibleRectDidChange;
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@end
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass WidgetPrivate {
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WidgetPrivate()
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        : previousVisibleRect(NSZeroRect)
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool mustStayInWindow;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool removeFromSuperviewSoon;
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    NSRect previousVisibleRect;
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void safeRemoveFromSuperview(NSView *view)
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the the view is the first responder, then set the window's first responder to nil so
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // we don't leave the window pointing to a view that's no longer in it.
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSWindow *window = [view window];
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSResponder *firstResponder = [window firstResponder];
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([firstResponder isKindOfClass:[NSView class]] && [(NSView *)firstResponder isDescendantOf:view])
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [window makeFirstResponder:nil];
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Suppress the resetting of drag margins since we know we can't affect them.
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL resetDragMargins = [window _needsToResetDragMargins];
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [window _setNeedsToResetDragMargins:NO];
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [view removeFromSuperview];
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [window _setNeedsToResetDragMargins:resetDragMargins];
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
93643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWidget::Widget(NSView *view)
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_data(new WidgetPrivate)
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    init(view);
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->mustStayInWindow = false;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data->removeFromSuperviewSoon = false;
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWidget::~Widget()
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_data;
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: Should move this to Chrome; bad layering that this knows about Frame.
10721939df44de1705786c545cd1bf519d47250322dBen Murdochvoid Widget::setFocus(bool focused)
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10921939df44de1705786c545cd1bf519d47250322dBen Murdoch    if (!focused)
11021939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
11121939df44de1705786c545cd1bf519d47250322dBen Murdoch
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = Frame::frameForWidget(this);
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frame)
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView *view = [platformWidget() _webcore_effectiveFirstResponder];
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (Page* page = frame->page())
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        page->chrome()->focusNSView(view);
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
125967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid Widget::setCursor(const Cursor& cursor)
126967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
127967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    ScrollView* view = root();
128967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!view)
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
130967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    view->hostWindow()->setCursor(cursor);
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::show()
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isSelfVisible())
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setSelfVisible(true);
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [getOuterView() setHidden:NO];
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::hide()
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isSelfVisible())
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setSelfVisible(false);
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [getOuterView() setHidden:YES];
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect Widget::frameRect() const
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!platformWidget())
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_frame;
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return enclosingIntRect([getOuterView() frame]);
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_frame;
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::setFrameRect(const IntRect& rect)
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame = rect;
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSView *outerView = getOuterView();
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!outerView)
176d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
177d0825bca7fe65beaee391d30da42e937db621564Steve Block
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Take a reference to this Widget, because sending messages to outerView can invoke arbitrary
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // code, which can deref it.
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<Widget> protectedThis(this);
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSRect visibleRect = [outerView visibleRect];
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRect f = rect;
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!NSEqualRects(f, [outerView frame])) {
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [outerView setFrame:f];
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [outerView setNeedsDisplay:NO];
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    } else if (!NSEqualRects(visibleRect, m_data->previousVisibleRect) && [outerView respondsToSelector:@selector(visibleRectDidChange)])
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [outerView visibleRectDidChange];
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_data->previousVisibleRect = visibleRect;
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid Widget::setBoundsSize(const IntSize& size)
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSSize nsSize = size;
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    BEGIN_BLOCK_OBJC_EXCEPTIONS;
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSView *outerView = getOuterView();
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!outerView)
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Take a reference to this Widget, because sending messages to outerView can invoke arbitrary
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // code, which can deref it.
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<Widget> protectedThis(this);
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!NSEqualSizes(nsSize, [outerView bounds].size)) {
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [outerView setBoundsSize:nsSize];
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [outerView setNeedsDisplay:NO];
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    END_BLOCK_OBJC_EXCEPTIONS;
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNSView *Widget::getOuterView() const
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSView *view = platformWidget();
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If this widget's view is a WebCoreFrameScrollView then we
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // resize its containing view, a WebFrameView.
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([view conformsToProtocol:@protocol(WebCoreFrameScrollView)]) {
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        view = [view superview];
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(view);
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return view;
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::paint(GraphicsContext* p, const IntRect& r)
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (p->paintingDisabled())
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView *view = getOuterView();
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Take a reference to this Widget, because sending messages to the views can invoke arbitrary
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // code, which can deref it.
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<Widget> protectedThis(this);
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntPoint transformOrigin = frameRect().location();
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    AffineTransform widgetToViewTranform = makeMapBetweenRects(IntRect(IntPoint(), frameRect().size()), [view bounds]);
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (currentContext == [[view window] graphicsContext] || ![currentContext isDrawingToScreen]) {
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // This is the common case of drawing into a window or printing.
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BEGIN_BLOCK_OBJC_EXCEPTIONS;
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextRef context = (CGContextRef)[currentContext graphicsPort];
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextSaveGState(context);
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextTranslateCTM(context, transformOrigin.x(), transformOrigin.y());
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextScaleCTM(context, narrowPrecisionToFloat(widgetToViewTranform.xScale()), narrowPrecisionToFloat(widgetToViewTranform.yScale()));
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextTranslateCTM(context, -transformOrigin.x(), -transformOrigin.y());
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        IntRect dirtyRect = r;
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        dirtyRect.move(-transformOrigin.x(), -transformOrigin.y());
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (![view isFlipped])
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            dirtyRect.setY([view bounds].size.height - dirtyRect.bottom());
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [view displayRectIgnoringOpacity:dirtyRect];
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextRestoreGState(context);
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        END_BLOCK_OBJC_EXCEPTIONS;
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // This is the case of drawing into a bitmap context other than a window backing store. It gets hit beneath
264d0825bca7fe65beaee391d30da42e937db621564Steve Block        // -cacheDisplayInRect:toBitmapImageRep:, and when painting into compositing layers.
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Transparent subframes are in fact implemented with scroll views that return YES from -drawsBackground (whenever the WebView
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // itself is in drawsBackground mode). In the normal drawing code path, the scroll views are never asked to draw the background,
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // so this is not an issue, but in this code path they are, so the following code temporarily turns background drwaing off.
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSView *innerView = platformWidget();
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSScrollView *scrollView = 0;
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([innerView conformsToProtocol:@protocol(WebCoreFrameScrollView)]) {
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT([innerView isKindOfClass:[NSScrollView class]]);
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSScrollView *scrollView = static_cast<NSScrollView *>(innerView);
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // -copiesOnScroll will return NO whenever the content view is not fully opaque.
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ([scrollView drawsBackground] && ![[scrollView contentView] copiesOnScroll])
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [scrollView setDrawsBackground:NO];
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                scrollView = 0;
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextRef cgContext = p->platformContext();
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(cgContext == [currentContext graphicsPort]);
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextSaveGState(cgContext);
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextTranslateCTM(cgContext, transformOrigin.x(), transformOrigin.y());
28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextScaleCTM(cgContext, narrowPrecisionToFloat(widgetToViewTranform.xScale()), narrowPrecisionToFloat(widgetToViewTranform.yScale()));
28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextTranslateCTM(cgContext, -transformOrigin.x(), -transformOrigin.y());
28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSRect viewFrame = [view frame];
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSRect viewBounds = [view bounds];
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Set up the translation and (flipped) orientation of the graphics context. In normal drawing, AppKit does it as it descends down
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // the view hierarchy.
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextTranslateCTM(cgContext, viewFrame.origin.x - viewBounds.origin.x, viewFrame.origin.y + viewFrame.size.height + viewBounds.origin.y);
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextScaleCTM(cgContext, 1, -1);
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        IntRect dirtyRect = r;
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        dirtyRect.move(-transformOrigin.x(), -transformOrigin.y());
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (![view isFlipped])
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            dirtyRect.setY([view bounds].size.height - dirtyRect.bottom());
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BEGIN_BLOCK_OBJC_EXCEPTIONS;
302635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef BUILDING_ON_TIGER
304635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            AutodrainedPool pool;
305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NSGraphicsContext *nsContext = [NSGraphicsContext graphicsContextWithGraphicsPort:cgContext flipped:YES];
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            [view displayRectIgnoringOpacity:dirtyRect inContext:nsContext];
308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        END_BLOCK_OBJC_EXCEPTIONS;
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextRestoreGState(cgContext);
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (scrollView)
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [scrollView setDrawsBackground:YES];
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::setIsSelected(bool isSelected)
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView *view = platformWidget();
32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([view respondsToSelector:@selector(webPlugInSetIsSelected:)])
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [view webPlugInSetIsSelected:isSelected];
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if ([view respondsToSelector:@selector(setIsSelected:)])
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [view setIsSelected:isSelected];
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::removeFromSuperview()
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_data->mustStayInWindow)
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->removeFromSuperviewSoon = true;
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->removeFromSuperviewSoon = false;
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BEGIN_BLOCK_OBJC_EXCEPTIONS;
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        safeRemoveFromSuperview(getOuterView());
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        END_BLOCK_OBJC_EXCEPTIONS;
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
342635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Widget::beforeMouseDown(NSView *unusedView, Widget* widget)
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (widget) {
345635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT_UNUSED(unusedView, unusedView == widget->getOuterView());
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(!widget->m_data->mustStayInWindow);
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        widget->m_data->mustStayInWindow = true;
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::afterMouseDown(NSView *view, Widget* widget)
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!widget) {
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BEGIN_BLOCK_OBJC_EXCEPTIONS;
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        safeRemoveFromSuperview(view);
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        END_BLOCK_OBJC_EXCEPTIONS;
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(widget->m_data->mustStayInWindow);
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        widget->m_data->mustStayInWindow = false;
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (widget->m_data->removeFromSuperviewSoon)
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            widget->removeFromSuperview();
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// These are here to deal with flipped coords on Mac.
3660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntRect Widget::convertFromRootToContainingWindow(const Widget* rootWidget, const IntRect& rect)
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!rootWidget->platformWidget())
3690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return rect;
3700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
3720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return enclosingIntRect([rootWidget->platformWidget() convertRect:rect toView:nil]);
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
3740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return rect;
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntRect Widget::convertFromContainingWindowToRoot(const Widget* rootWidget, const IntRect& rect)
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!rootWidget->platformWidget())
3810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return rect;
3820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
3840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return enclosingIntRect([rootWidget->platformWidget() convertRect:rect fromView:nil]);
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
3860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return rect;
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntPoint Widget::convertFromRootToContainingWindow(const Widget* rootWidget, const IntPoint& point)
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!rootWidget->platformWidget())
3930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return point;
3940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
3960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return IntPoint([rootWidget->platformWidget() convertPoint:point toView:nil]);
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
3980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return point;
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntPoint Widget::convertFromContainingWindowToRoot(const Widget* rootWidget, const IntPoint& point)
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!rootWidget->platformWidget())
4040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return point;
4050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
4070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return IntPoint([rootWidget->platformWidget() convertPoint:point fromView:nil]);
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return point;
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
413bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenNSView *Widget::platformWidget() const
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
415bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return m_widget.get();
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
418bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid Widget::setPlatformWidget(NSView *widget)
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
420bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (widget == m_widget)
421bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return;
422bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
423bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_widget = widget;
424bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_data->previousVisibleRect = NSZeroRect;
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
427643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebCore
428