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