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