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
1182bde8e466a4451c7319e3a072d118917957d6554Steve Block    // If there's no platformWidget, WK2 is running. The focus() method needs to be used
1192bde8e466a4451c7319e3a072d118917957d6554Steve Block    // to bring focus to the right view on the UIProcess side.
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView *view = [platformWidget() _webcore_effectiveFirstResponder];
1212bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (Page* page = frame->page()) {
1222bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!platformWidget())
1232bde8e466a4451c7319e3a072d118917957d6554Steve Block            page->chrome()->focus();
1242bde8e466a4451c7319e3a072d118917957d6554Steve Block        else
1252bde8e466a4451c7319e3a072d118917957d6554Steve Block            page->chrome()->focusNSView(view);
1262bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
130967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid Widget::setCursor(const Cursor& cursor)
131967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
132967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    ScrollView* view = root();
133967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!view)
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
135967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    view->hostWindow()->setCursor(cursor);
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::show()
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isSelfVisible())
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setSelfVisible(true);
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [getOuterView() setHidden:NO];
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::hide()
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isSelfVisible())
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setSelfVisible(false);
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [getOuterView() setHidden:YES];
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectIntRect Widget::frameRect() const
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!platformWidget())
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_frame;
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return enclosingIntRect([getOuterView() frame]);
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_frame;
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::setFrameRect(const IntRect& rect)
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_frame = rect;
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSView *outerView = getOuterView();
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!outerView)
181d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
182d0825bca7fe65beaee391d30da42e937db621564Steve Block
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Take a reference to this Widget, because sending messages to outerView can invoke arbitrary
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // code, which can deref it.
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<Widget> protectedThis(this);
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSRect visibleRect = [outerView visibleRect];
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRect f = rect;
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!NSEqualRects(f, [outerView frame])) {
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [outerView setFrame:f];
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [outerView setNeedsDisplay:NO];
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    } else if (!NSEqualRects(visibleRect, m_data->previousVisibleRect) && [outerView respondsToSelector:@selector(visibleRectDidChange)])
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [outerView visibleRectDidChange];
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_data->previousVisibleRect = visibleRect;
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid Widget::setBoundsSize(const IntSize& size)
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSSize nsSize = size;
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    BEGIN_BLOCK_OBJC_EXCEPTIONS;
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSView *outerView = getOuterView();
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!outerView)
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Take a reference to this Widget, because sending messages to outerView can invoke arbitrary
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // code, which can deref it.
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<Widget> protectedThis(this);
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!NSEqualSizes(nsSize, [outerView bounds].size)) {
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [outerView setBoundsSize:nsSize];
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [outerView setNeedsDisplay:NO];
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    END_BLOCK_OBJC_EXCEPTIONS;
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNSView *Widget::getOuterView() const
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSView *view = platformWidget();
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If this widget's view is a WebCoreFrameScrollView then we
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // resize its containing view, a WebFrameView.
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([view conformsToProtocol:@protocol(WebCoreFrameScrollView)]) {
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        view = [view superview];
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(view);
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return view;
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::paint(GraphicsContext* p, const IntRect& r)
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (p->paintingDisabled())
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView *view = getOuterView();
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Take a reference to this Widget, because sending messages to the views can invoke arbitrary
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // code, which can deref it.
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<Widget> protectedThis(this);
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntPoint transformOrigin = frameRect().location();
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    AffineTransform widgetToViewTranform = makeMapBetweenRects(IntRect(IntPoint(), frameRect().size()), [view bounds]);
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (currentContext == [[view window] graphicsContext] || ![currentContext isDrawingToScreen]) {
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // This is the common case of drawing into a window or printing.
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BEGIN_BLOCK_OBJC_EXCEPTIONS;
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextRef context = (CGContextRef)[currentContext graphicsPort];
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextSaveGState(context);
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextTranslateCTM(context, transformOrigin.x(), transformOrigin.y());
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextScaleCTM(context, narrowPrecisionToFloat(widgetToViewTranform.xScale()), narrowPrecisionToFloat(widgetToViewTranform.yScale()));
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextTranslateCTM(context, -transformOrigin.x(), -transformOrigin.y());
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        IntRect dirtyRect = r;
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        dirtyRect.move(-transformOrigin.x(), -transformOrigin.y());
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (![view isFlipped])
2602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            dirtyRect.setY([view bounds].size.height - dirtyRect.maxY());
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [view displayRectIgnoringOpacity:dirtyRect];
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextRestoreGState(context);
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        END_BLOCK_OBJC_EXCEPTIONS;
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // This is the case of drawing into a bitmap context other than a window backing store. It gets hit beneath
269d0825bca7fe65beaee391d30da42e937db621564Steve Block        // -cacheDisplayInRect:toBitmapImageRep:, and when painting into compositing layers.
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Transparent subframes are in fact implemented with scroll views that return YES from -drawsBackground (whenever the WebView
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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,
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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.
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSView *innerView = platformWidget();
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSScrollView *scrollView = 0;
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([innerView conformsToProtocol:@protocol(WebCoreFrameScrollView)]) {
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT([innerView isKindOfClass:[NSScrollView class]]);
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSScrollView *scrollView = static_cast<NSScrollView *>(innerView);
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // -copiesOnScroll will return NO whenever the content view is not fully opaque.
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ([scrollView drawsBackground] && ![[scrollView contentView] copiesOnScroll])
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [scrollView setDrawsBackground:NO];
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                scrollView = 0;
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextRef cgContext = p->platformContext();
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(cgContext == [currentContext graphicsPort]);
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextSaveGState(cgContext);
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextTranslateCTM(cgContext, transformOrigin.x(), transformOrigin.y());
29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextScaleCTM(cgContext, narrowPrecisionToFloat(widgetToViewTranform.xScale()), narrowPrecisionToFloat(widgetToViewTranform.yScale()));
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextTranslateCTM(cgContext, -transformOrigin.x(), -transformOrigin.y());
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSRect viewFrame = [view frame];
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSRect viewBounds = [view bounds];
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // the view hierarchy.
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextTranslateCTM(cgContext, viewFrame.origin.x - viewBounds.origin.x, viewFrame.origin.y + viewFrame.size.height + viewBounds.origin.y);
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextScaleCTM(cgContext, 1, -1);
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        IntRect dirtyRect = r;
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        dirtyRect.move(-transformOrigin.x(), -transformOrigin.y());
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (![view isFlipped])
3042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            dirtyRect.setY([view bounds].size.height - dirtyRect.maxY());
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BEGIN_BLOCK_OBJC_EXCEPTIONS;
307635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef BUILDING_ON_TIGER
309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            AutodrainedPool pool;
310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NSGraphicsContext *nsContext = [NSGraphicsContext graphicsContextWithGraphicsPort:cgContext flipped:YES];
31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            [view displayRectIgnoringOpacity:dirtyRect inContext:nsContext];
313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        END_BLOCK_OBJC_EXCEPTIONS;
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CGContextRestoreGState(cgContext);
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (scrollView)
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [scrollView setDrawsBackground:YES];
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::setIsSelected(bool isSelected)
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView *view = platformWidget();
32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([view respondsToSelector:@selector(webPlugInSetIsSelected:)])
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [view webPlugInSetIsSelected:isSelected];
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if ([view respondsToSelector:@selector(setIsSelected:)])
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [view setIsSelected:isSelected];
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::removeFromSuperview()
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_data->mustStayInWindow)
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->removeFromSuperviewSoon = true;
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_data->removeFromSuperviewSoon = false;
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BEGIN_BLOCK_OBJC_EXCEPTIONS;
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        safeRemoveFromSuperview(getOuterView());
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        END_BLOCK_OBJC_EXCEPTIONS;
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Widget::beforeMouseDown(NSView *unusedView, Widget* widget)
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (widget) {
350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT_UNUSED(unusedView, unusedView == widget->getOuterView());
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(!widget->m_data->mustStayInWindow);
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        widget->m_data->mustStayInWindow = true;
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Widget::afterMouseDown(NSView *view, Widget* widget)
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!widget) {
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BEGIN_BLOCK_OBJC_EXCEPTIONS;
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        safeRemoveFromSuperview(view);
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        END_BLOCK_OBJC_EXCEPTIONS;
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(widget->m_data->mustStayInWindow);
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        widget->m_data->mustStayInWindow = false;
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (widget->m_data->removeFromSuperviewSoon)
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            widget->removeFromSuperview();
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// These are here to deal with flipped coords on Mac.
3710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntRect Widget::convertFromRootToContainingWindow(const Widget* rootWidget, const IntRect& rect)
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!rootWidget->platformWidget())
3740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return rect;
3750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
3770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return enclosingIntRect([rootWidget->platformWidget() convertRect:rect toView:nil]);
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
3790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return rect;
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntRect Widget::convertFromContainingWindowToRoot(const Widget* rootWidget, const IntRect& rect)
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!rootWidget->platformWidget())
3860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return rect;
3870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
3890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return enclosingIntRect([rootWidget->platformWidget() convertRect:rect fromView:nil]);
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
3910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return rect;
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntPoint Widget::convertFromRootToContainingWindow(const Widget* rootWidget, const IntPoint& point)
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!rootWidget->platformWidget())
3980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return point;
3990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
4010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return IntPoint([rootWidget->platformWidget() convertPoint:point toView:nil]);
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
4030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return point;
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochIntPoint Widget::convertFromContainingWindowToRoot(const Widget* rootWidget, const IntPoint& point)
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!rootWidget->platformWidget())
4090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return point;
4100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BEGIN_BLOCK_OBJC_EXCEPTIONS;
4120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return IntPoint([rootWidget->platformWidget() convertPoint:point fromView:nil]);
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    END_BLOCK_OBJC_EXCEPTIONS;
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return point;
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
418bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenNSView *Widget::platformWidget() const
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
420bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return m_widget.get();
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
423bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid Widget::setPlatformWidget(NSView *widget)
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
425bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (widget == m_widget)
426bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return;
427bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
428bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_widget = widget;
429bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    m_data->previousVisibleRect = NSZeroRect;
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
432643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebCore
433