18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
22daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 David Smith (catfish.man@gmail.com)
4967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch * Copyright (C) 2010 Igalia S.L
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebViewInternal.h"
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebViewData.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "DOMCSSStyleDeclarationInternal.h"
350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "DOMNodeInternal.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "DOMRangeInternal.h"
37db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#import "WebApplicationCache.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebBackForwardListInternal.h"
39cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#import "WebBaseNetscapePluginView.h"
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "WebCache.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebChromeClient.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebContextMenuClient.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDOMOperationsPrivate.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDataSourceInternal.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDatabaseManagerInternal.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDefaultEditingDelegate.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDefaultPolicyDelegate.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDefaultUIDelegate.h"
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebDelegateImplementationCaching.h"
505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#import "WebDeviceOrientationClient.h"
515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#import "WebDeviceOrientationProvider.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDocument.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDocumentInternal.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDownload.h"
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDownloadInternal.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDragClient.h"
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDynamicScrollBarsViewInternal.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebEditingDelegate.h"
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebEditorClient.h"
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFormDelegatePrivate.h"
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameInternal.h"
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameViewInternal.h"
63cad810f21b803229eb11403f9209855525a25d57Steve Block#import "WebFullScreenController.h"
646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#import "WebGeolocationClient.h"
65d0825bca7fe65beaee391d30da42e937db621564Steve Block#import "WebGeolocationPositionInternal.h"
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebHTMLRepresentation.h"
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebHTMLViewInternal.h"
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebHistoryItemInternal.h"
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebIconDatabaseInternal.h"
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebInspector.h"
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebInspectorClient.h"
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitErrors.h"
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitLogging.h"
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitNSStringExtras.h"
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitStatisticsPrivate.h"
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitSystemBits.h"
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitVersionChecks.h"
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebLocalizableStrings.h"
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSDataExtras.h"
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSDataExtrasPrivate.h"
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSDictionaryExtras.h"
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSEventExtras.h"
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSObjectExtras.h"
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSPasteboardExtras.h"
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSPrintOperationExtras.h"
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSURLExtras.h"
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSURLRequestExtras.h"
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSViewExtras.h"
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebNodeHighlight.h"
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebPDFView.h"
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebPanelAuthenticationHandler.h"
9206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#import "WebPlatformStrategies.h"
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebPluginDatabase.h"
94231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import "WebPluginHalterClient.h"
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebPolicyDelegate.h"
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebPreferenceKeysPrivate.h"
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebPreferencesPrivate.h"
98563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import "WebScriptDebugDelegate.h"
99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#import "WebScriptWorldInternal.h"
1002bde8e466a4451c7319e3a072d118917957d6554Steve Block#import "WebStorageManagerInternal.h"
1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebSystemInterface.h"
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebTextCompletionController.h"
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebTextIterator.h"
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebUIDelegate.h"
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebUIDelegatePrivate.h"
106231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import "WebVideoFullscreenController.h"
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <CoreFoundation/CFSet.h>
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <Foundation/NSURLConnection.h>
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <JavaScriptCore/APICast.h>
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <JavaScriptCore/JSValueRef.h>
11106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#import <WebCore/AbstractDatabase.h>
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/ApplicationCacheStorage.h>
113e14391e94c850b8bd03680c23b38978db68687a8John Reck#import <WebCore/BackForwardListImpl.h>
11428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#import <WebCore/MemoryCache.h>
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/ColorMac.h>
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <WebCore/CSSComputedStyleDeclaration.h>
117563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/Cursor.h>
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Document.h>
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/DocumentLoader.h>
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/DragController.h>
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/DragData.h>
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Editor.h>
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/EventHandler.h>
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/ExceptionHandlers.h>
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/FocusController.h>
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Frame.h>
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/FrameLoader.h>
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/FrameTree.h>
1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/FrameView.h>
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/GCController.h>
131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#import <WebCore/HTMLMediaElement.h>
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/HTMLNames.h>
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/HistoryItem.h>
134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <WebCore/IconDatabase.h>
135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <WebCore/JSCSSStyleDeclaration.h>
136bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#import <WebCore/JSDocument.h>
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <WebCore/JSElement.h>
138bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#import <WebCore/JSNodeList.h>
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Logging.h>
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/MIMETypeRegistry.h>
141bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#import <WebCore/NodeList.h>
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Page.h>
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/PageCache.h>
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/PageGroup.h>
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/PlatformMouseEvent.h>
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/ProgressTracker.h>
147e14391e94c850b8bd03680c23b38978db68687a8John Reck#import <WebCore/RenderView.h>
148cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#import <WebCore/RenderWidget.h>
1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/ResourceHandle.h>
1506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#import <WebCore/ResourceLoadScheduler.h>
1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#import <WebCore/ResourceRequest.h>
1520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/RuntimeApplicationChecks.h>
1530617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#import <WebCore/SchemeRegistry.h>
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/ScriptController.h>
155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <WebCore/ScriptValue.h>
1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/SecurityOrigin.h>
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/SelectionController.h>
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Settings.h>
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/TextResourceDecoder.h>
160635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <WebCore/ThreadCheck.h>
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/WebCoreObjCExtras.h>
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/WebCoreView.h>
1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/Widget.h>
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/DOM.h>
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/DOMExtensions.h>
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/DOMPrivate.h>
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKitSystemInterface.h>
168563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <mach-o/dyld.h>
169563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <objc/objc-auto.h>
170563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <objc/objc-runtime.h>
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <runtime/ArrayPrototype.h>
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <runtime/DateInstance.h>
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <runtime/InitializeThreading.h>
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <runtime/JSLock.h>
175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <runtime/JSValue.h>
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/Assertions.h>
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/HashTraits.h>
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/RefCountedLeakCounter.h>
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/RefPtr.h>
180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <wtf/StdLibExtras.h>
18121939df44de1705786c545cd1bf519d47250322dBen Murdoch#import <wtf/Threading.h>
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebDashboardRegion.h>
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
187d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(CLIENT_BASED_GEOLOCATION)
188d0825bca7fe65beaee391d30da42e937db621564Steve Block#import <WebCore/GeolocationController.h>
189d0825bca7fe65beaee391d30da42e937db621564Steve Block#import <WebCore/GeolocationError.h>
190d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
191d0825bca7fe65beaee391d30da42e937db621564Steve Block
192a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if ENABLE(GLIB_SUPPORT)
193ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#import <glib.h>
194ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif
195ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch@interface NSSpellChecker (WebNSSpellCheckerDetails)
1970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_preflightChosenSpellServer;
1980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch@end
1990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch@interface NSView (WebNSViewDetails)
2010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (NSView *)_hitTest:(NSPoint *)aPoint dragTypes:(NSSet *)types;
2020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_autoscrollForDraggingInfo:(id)dragInfo timeDelta:(NSTimeInterval)repeatDelta;
2030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)_shouldAutoscrollForDraggingInfo:(id)dragInfo;
2040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch@end
2050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch@interface NSWindow (WebNSWindowDetails)
2070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (id)_oldFirstResponderBeforeBecoming;
20821939df44de1705786c545cd1bf519d47250322dBen Murdoch- (void)_enableScreenUpdatesIfNeeded;
20906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen- (BOOL)_wrapsCarbonWindow;
2100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch@end
2110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore;
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace JSC;
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if defined(__ppc__) || defined(__ppc64__)
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define PROCESSOR "PPC"
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#elif defined(__i386__) || defined(__x86_64__)
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define PROCESSOR "Intel"
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#error Unknown architecture
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define FOR_EACH_RESPONDER_SELECTOR(macro) \
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(alignCenter) \
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(alignJustified) \
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(alignLeft) \
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(alignRight) \
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(capitalizeWord) \
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(centerSelectionInVisibleArea) \
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(changeAttributes) \
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(changeBaseWritingDirection) \
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(changeBaseWritingDirectionToLTR) \
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(changeBaseWritingDirectionToRTL) \
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(changeColor) \
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(changeDocumentBackgroundColor) \
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(changeFont) \
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(changeSpelling) \
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(checkSpelling) \
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(complete) \
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(copy) \
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(copyFont) \
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(cut) \
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(delete) \
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(deleteBackward) \
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(deleteBackwardByDecomposingPreviousCharacter) \
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(deleteForward) \
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(deleteToBeginningOfLine) \
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(deleteToBeginningOfParagraph) \
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(deleteToEndOfLine) \
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(deleteToEndOfParagraph) \
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(deleteToMark) \
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(deleteWordBackward) \
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(deleteWordForward) \
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(ignoreSpelling) \
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(indent) \
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(insertBacktab) \
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(insertLineBreak) \
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(insertNewline) \
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(insertNewlineIgnoringFieldEditor) \
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(insertParagraphSeparator) \
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(insertTab) \
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(insertTabIgnoringFieldEditor) \
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(lowercaseWord) \
264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectmacro(makeBaseWritingDirectionLeftToRight) \
265635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectmacro(makeBaseWritingDirectionRightToLeft) \
266635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectmacro(makeTextWritingDirectionLeftToRight) \
267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectmacro(makeTextWritingDirectionNatural) \
268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectmacro(makeTextWritingDirectionRightToLeft) \
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveBackward) \
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveBackwardAndModifySelection) \
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveDown) \
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveDownAndModifySelection) \
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveForward) \
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveForwardAndModifySelection) \
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveLeft) \
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveLeftAndModifySelection) \
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveParagraphBackwardAndModifySelection) \
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveParagraphForwardAndModifySelection) \
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveRight) \
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveRightAndModifySelection) \
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToBeginningOfDocument) \
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToBeginningOfDocumentAndModifySelection) \
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToBeginningOfLine) \
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToBeginningOfLineAndModifySelection) \
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToBeginningOfParagraph) \
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToBeginningOfParagraphAndModifySelection) \
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToBeginningOfSentence) \
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToBeginningOfSentenceAndModifySelection) \
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToEndOfDocument) \
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToEndOfDocumentAndModifySelection) \
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToEndOfLine) \
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToEndOfLineAndModifySelection) \
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToEndOfParagraph) \
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToEndOfParagraphAndModifySelection) \
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToEndOfSentence) \
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveToEndOfSentenceAndModifySelection) \
297563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmacro(moveToLeftEndOfLine) \
298563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmacro(moveToLeftEndOfLineAndModifySelection) \
299563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmacro(moveToRightEndOfLine) \
300563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmacro(moveToRightEndOfLineAndModifySelection) \
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveUp) \
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveUpAndModifySelection) \
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveWordBackward) \
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveWordBackwardAndModifySelection) \
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveWordForward) \
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveWordForwardAndModifySelection) \
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveWordLeft) \
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveWordLeftAndModifySelection) \
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveWordRight) \
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(moveWordRightAndModifySelection) \
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(outdent) \
3120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochmacro(orderFrontSubstitutionsPanel) \
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(pageDown) \
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(pageDownAndModifySelection) \
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(pageUp) \
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(pageUpAndModifySelection) \
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(paste) \
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(pasteAsPlainText) \
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(pasteAsRichText) \
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(pasteFont) \
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(performFindPanelAction) \
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(scrollLineDown) \
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(scrollLineUp) \
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(scrollPageDown) \
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(scrollPageUp) \
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(scrollToBeginningOfDocument) \
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(scrollToEndOfDocument) \
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(selectAll) \
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(selectLine) \
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(selectParagraph) \
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(selectSentence) \
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(selectToMark) \
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(selectWord) \
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(setMark) \
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(showGuessPanel) \
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(startSpeaking) \
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(stopSpeaking) \
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(subscript) \
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(superscript) \
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(swapWithMark) \
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(takeFindStringFromSelection) \
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(toggleBaseWritingDirection) \
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(transpose) \
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(underline) \
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(unscript) \
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(uppercaseWord) \
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(yank) \
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectmacro(yankAndSelect) \
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WebKitOriginalTopPrintingMarginKey @"WebKitOriginalTopMargin"
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WebKitOriginalBottomPrintingMarginKey @"WebKitOriginalBottomMargin"
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define KeyboardUIModeDidChangeNotification @"com.apple.KeyboardUIModeDidChange"
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define AppleKeyboardUIMode CFSTR("AppleKeyboardUIMode")
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define UniversalAccessDomain CFSTR("com.apple.universalaccess")
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic BOOL s_didSetCacheModel;
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WebCacheModel s_cacheModel = WebCacheModelDocumentViewer;
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const char webViewIsOpen[] = "At least one WebView is still open.";
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch@interface NSObject (WebValidateWithoutDelegate)
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)validateUserInterfaceItemWithoutDelegate:(id <NSValidatedUserInterfaceItem>)item;
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface _WebSafeForwarder : NSObject
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id target; // Non-retained. Don't retain delegates.
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id defaultTarget;
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL catchExceptions;
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithTarget:(id)target defaultTarget:(id)defaultTarget catchExceptions:(BOOL)catchExceptions;
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface WebView (WebFileInternal)
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_isLoading;
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebFrameView *)_frameViewAtWindowPoint:(NSPoint)point;
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebFrame *)_focusedFrame;
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)_preflightSpellChecker;
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_continuousCheckingAllowed;
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSResponder *)_responderForResponderOperations;
3840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
3850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_clearLayerSyncLoopObserver;
3860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
387a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if ENABLE(GLIB_SUPPORT)
388ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block- (void)_clearGlibLoopObserver;
389ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
392635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void patchMailRemoveAttributesMethod();
393635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementDOMNodeKey =            @"WebElementDOMNode";
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementFrameKey =              @"WebElementFrame";
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementImageKey =              @"WebElementImage";
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementImageAltStringKey =     @"WebElementImageAltString";
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementImageRectKey =          @"WebElementImageRect";
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementImageURLKey =           @"WebElementImageURL";
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementIsSelectedKey =         @"WebElementIsSelected";
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementLinkLabelKey =          @"WebElementLinkLabel";
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementLinkTargetFrameKey =    @"WebElementTargetFrame";
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementLinkTitleKey =          @"WebElementLinkTitle";
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementLinkURLKey =            @"WebElementLinkURL";
405e14391e94c850b8bd03680c23b38978db68687a8John ReckNSString *WebElementMediaURLKey =           @"WebElementMediaURL";
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementSpellingToolTipKey =    @"WebElementSpellingToolTip";
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementTitleKey =              @"WebElementTitle";
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementLinkIsLiveKey =         @"WebElementLinkIsLive";
409d0825bca7fe65beaee391d30da42e937db621564Steve BlockNSString *WebElementIsInScrollBarKey =      @"WebElementIsInScrollBar";
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebElementIsContentEditableKey =  @"WebElementIsContentEditableKey";
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebViewProgressStartedNotification =          @"WebProgressStartedNotification";
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebViewProgressEstimateChangedNotification =  @"WebProgressEstimateChangedNotification";
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebViewProgressFinishedNotification =         @"WebProgressFinishedNotification";
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString * const WebViewDidBeginEditingNotification =         @"WebViewDidBeginEditingNotification";
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString * const WebViewDidChangeNotification =               @"WebViewDidChangeNotification";
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString * const WebViewDidEndEditingNotification =           @"WebViewDidEndEditingNotification";
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString * const WebViewDidChangeTypingStyleNotification =    @"WebViewDidChangeTypingStyleNotification";
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString * const WebViewDidChangeSelectionNotification =      @"WebViewDidChangeSelectionNotification";
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectenum { WebViewVersion = 4 };
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define timedLayoutSize 4096
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSMutableSet *schemesWithRepresentationsSet;
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *_WebCanGoBackKey =            @"canGoBack";
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *_WebCanGoForwardKey =         @"canGoForward";
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *_WebEstimatedProgressKey =    @"estimatedProgress";
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *_WebIsLoadingKey =            @"isLoading";
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *_WebMainFrameIconKey =        @"mainFrameIcon";
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *_WebMainFrameTitleKey =       @"mainFrameTitle";
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *_WebMainFrameURLKey =         @"mainFrameURL";
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *_WebMainFrameDocumentKey =    @"mainFrameDocument";
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
437643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockNSString *_WebViewDidStartAcceleratedCompositingNotification = @"_WebViewDidStartAcceleratedCompositing";
438643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface WebProgressItem : NSObject
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@public
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    long long bytesReceived;
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    long long estimatedLength;
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebProgressItem
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic BOOL continuousSpellCheckingEnabled;
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic BOOL grammarCheckingEnabled;
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
4550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic BOOL automaticQuoteSubstitutionEnabled;
4560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic BOOL automaticLinkDetectionEnabled;
4570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic BOOL automaticDashSubstitutionEnabled;
4580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic BOOL automaticTextReplacementEnabled;
4590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic BOOL automaticSpellingCorrectionEnabled;
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (AllWebViews)
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic CFSetCallBacks NonRetainingSetCallbacks = {
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    0,
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NULL,
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NULL,
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFCopyDescription,
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFEqual,
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFHash
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic CFMutableSetRef allWebViewsSet;
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)_makeAllWebViewsPerformSelector:(SEL)selector
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allWebViewsSet)
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [(NSMutableSet *)allWebViewsSet makeObjectsPerformSelector:selector];
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_removeFromAllWebViewsSet
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (allWebViewsSet)
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CFSetRemoveValue(allWebViewsSet, self);
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_addToAllWebViewsSet
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allWebViewsSet)
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        allWebViewsSet = CFSetCreateMutable(NULL, 0, &NonRetainingSetCallbacks);
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFSetSetValue(allWebViewsSet, self);
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (WebPrivate)
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline int callGestalt(OSType selector)
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SInt32 value = 0;
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Gestalt(selector, &value);
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return value;
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Uses underscores instead of dots because if "4." ever appears in a user agent string, old DHTML libraries treat it as Netscape 4.
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSString *createMacOSXVersionString()
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Can't use -[NSProcessInfo operatingSystemVersionString] because it has too much stuff we don't want.
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int major = callGestalt(gestaltSystemVersionMajor);
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(major);
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int minor = callGestalt(gestaltSystemVersionMinor);
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int bugFix = callGestalt(gestaltSystemVersionBugFix);
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (bugFix)
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [[NSString alloc] initWithFormat:@"%d_%d_%d", major, minor, bugFix];
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (minor)
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [[NSString alloc] initWithFormat:@"%d_%d", major, minor];
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[NSString alloc] initWithFormat:@"%d", major];
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSString *createUserVisibleWebKitVersionString()
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the version is 4 digits long or longer, then the first digit represents
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the version of the OS. Our user agent string should not include this first digit,
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // so strip it off and report the rest as the version. <rdar://problem/4997547>
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *fullVersion = [[NSBundle bundleForClass:[WebView class]] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRange nonDigitRange = [fullVersion rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]];
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (nonDigitRange.location == NSNotFound && [fullVersion length] >= 4)
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [[fullVersion substringFromIndex:1] copy];
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (nonDigitRange.location != NSNotFound && nonDigitRange.location >= 4)
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [[fullVersion substringFromIndex:1] copy];
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [fullVersion copy];
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSString *)_standardUserAgentWithApplicationName:(NSString *)applicationName
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Note: Do *not* move the initialization of osVersion nor webKitVersion into the declaration.
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Garbage collection won't correctly mark the global variable in that case <rdar://problem/5733674>.
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static NSString *osVersion;
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static NSString *webKitVersion;
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!osVersion)
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        osVersion = createMacOSXVersionString();
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!webKitVersion)
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        webKitVersion = createUserVisibleWebKitVersionString();
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([applicationName length])
54981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return [NSString stringWithFormat:@"Mozilla/5.0 (Macintosh; " PROCESSOR " Mac OS X %@) AppleWebKit/%@ (KHTML, like Gecko) %@", osVersion, webKitVersion, applicationName];
55081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return [NSString stringWithFormat:@"Mozilla/5.0 (Macintosh; " PROCESSOR " Mac OS X %@) AppleWebKit/%@ (KHTML, like Gecko)", osVersion, webKitVersion];
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen+ (void)_reportException:(JSValueRef)exception inContext:(JSContextRef)context
5546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
5556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!exception || !context)
5566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return;
5576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
5586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    JSLock lock(SilenceAssertionsOnly);
5596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    JSC::ExecState* execState = toJS(context);
5606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
5616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    // Make sure the context has a DOMWindow global object, otherwise this context didn't originate from a WebView.
5626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!toJSDOMWindow(execState->lexicalGlobalObject()))
5636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return;
5646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
5656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    reportException(execState, toJS(execState, exception));
5666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
5676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void WebKitInitializeApplicationCachePathIfNecessary()
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
570d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(OFFLINE_WEB_APPLICATIONS)
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static BOOL initialized = NO;
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (initialized)
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *appName = [[NSBundle mainBundle] bundleIdentifier];
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!appName)
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        appName = [[NSProcessInfo processInfo] processName];
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(appName);
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString* cacheDir = [NSString _webkit_localCacheDirectoryWithBundleIdentifier:appName];
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cacheStorage().setCacheDirectory(cacheDir);
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initialized = YES;
585d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool runningLeopardMail()
589563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
590563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#ifdef BUILDING_ON_LEOPARD
5910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return applicationIsAppleMail();
592563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif
593563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return NO;
594563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
595563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
596563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic bool runningTigerMail()
597563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
598563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#ifdef BUILDING_ON_TIGER
5990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return applicationIsAppleMail();
600563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif
601563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return NO;
602563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
603563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
604dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic bool coreVideoHas7228836Fix()
605dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
606dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifdef BUILDING_ON_LEOPARD
607dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    NSBundle* coreVideoFrameworkBundle = [NSBundle bundleWithPath:@"/System/Library/Frameworks/CoreVideo.framework"];
608dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    double version = [[coreVideoFrameworkBundle objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey] doubleValue];
609dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return (version >= 48);
610dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
611dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return true;
612dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
613dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
614d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic bool shouldEnableLoadDeferring()
615d0825bca7fe65beaee391d30da42e937db621564Steve Block{
616d0825bca7fe65beaee391d30da42e937db621564Steve Block    return !applicationIsAdobeInstaller();
617d0825bca7fe65beaee391d30da42e937db621564Steve Block}
618d0825bca7fe65beaee391d30da42e937db621564Steve Block
6190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_dispatchPendingLoadRequests
6200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
6216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    resourceLoadScheduler()->servePendingRequests();
6220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
6230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_registerDraggedTypes
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray *editableTypes = [WebHTMLView _insertablePasteboardTypes];
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray *URLTypes = [NSPasteboard _web_dragTypesForURL];
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableSet *types = [[NSMutableSet alloc] initWithArray:editableTypes];
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [types addObjectsFromArray:URLTypes];
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self registerForDraggedTypes:[types allObjects]];
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [types release];
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_usesDocumentViews
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return _private->usesDocumentViews;
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic NSString *leakMailQuirksUserScriptContents()
640a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
641a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    NSString *scriptPath = [[NSBundle bundleForClass:[WebView class]] pathForResource:@"MailQuirksUserScript" ofType:@"js"];
6422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NSStringEncoding encoding;
6432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return [[NSString alloc] initWithContentsOfFile:scriptPath usedEncoding:&encoding error:0];
644a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
645a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
646a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch- (void)_injectMailQuirksScript
647a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
6482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static NSString *mailQuirksScriptContents = leakMailQuirksUserScriptContents();
6492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    core(self)->group().addUserScriptToWorld(core([WebScriptWorld world]),
6502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        mailQuirksScriptContents, KURL(), 0, 0, InjectAtDocumentEnd, InjectInAllFrames);
6512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
6522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic bool needsOutlookQuirksScript()
6542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
6552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static bool isOutlookNeedingQuirksScript = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_HTML5_PARSER)
6562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        && applicationIsMicrosoftOutlook();
6572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return isOutlookNeedingQuirksScript;
6582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
6592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic NSString *leakOutlookQuirksUserScriptContents()
6612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
6622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NSString *scriptPath = [[NSBundle bundleForClass:[WebView class]] pathForResource:@"OutlookQuirksUserScript" ofType:@"js"];
6632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NSStringEncoding encoding;
6642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return [[NSString alloc] initWithContentsOfFile:scriptPath usedEncoding:&encoding error:0];
6652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
6662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch-(void)_injectOutlookQuirksScript
6682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
6692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static NSString *outlookQuirksScriptContents = leakOutlookQuirksUserScriptContents();
670a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    core(self)->group().addUserScriptToWorld(core([WebScriptWorld world]),
6712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        outlookQuirksScriptContents, KURL(), 0, 0, InjectAtDocumentEnd, InjectInAllFrames);
672a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
673a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_commonInitializationWithFrameName:(NSString *)frameName groupName:(NSString *)groupName usesDocumentViews:(BOOL)usesDocumentViews
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
676563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
677635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WTF::RefCountedLeakCounter::suppressMessages(webViewIsOpen);
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebPreferences *standardPreferences = [WebPreferences standardPreferences];
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [standardPreferences willAddToWebView];
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->preferences = [standardPreferences retain];
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->catchesDelegateExceptions = YES;
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->mainFrameDocumentReady = NO;
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->drawsBackground = YES;
6890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _private->backgroundColor = [[NSColor colorWithDeviceWhite:1 alpha:1] retain];
6900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _private->usesDocumentViews = usesDocumentViews;
691692e5dbf12901edacf14812a6fae25462920af42Steve Block    _private->includesFlattenedCompositingLayersWhenDrawingToBitmap = YES;
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrameView *frameView = nil;
6940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private->usesDocumentViews) {
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSRect f = [self frame];
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        frameView = [[WebFrameView alloc] initWithFrame: NSMakeRect(0,0,f.size.width,f.size.height)];
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [frameView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self addSubview:frameView];
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [frameView release];
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
702635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static bool didOneTimeInitialization = false;
703635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!didOneTimeInitialization) {
704635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        WebKitInitializeLoggingChannelsIfNecessary();
705635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        WebCore::InitializeLoggingChannelsIfNecessary();
706635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        [WebHistoryItem initWindowWatcherIfNecessary];
7078ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#if ENABLE(DATABASE)
708635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        WebKitInitializeDatabasesIfNecessary();
7098ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#endif
7102bde8e466a4451c7319e3a072d118917957d6554Steve Block
7112bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(DOM_STORAGE)
7122bde8e466a4451c7319e3a072d118917957d6554Steve Block        WebKitInitializeStorageIfNecessary();
7132bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
714635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        WebKitInitializeApplicationCachePathIfNecessary();
715635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        patchMailRemoveAttributesMethod();
71606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
71706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // Initialize our platform strategies.
71806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        WebPlatformStrategies::initialize();
71981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        Settings::setDefaultMinDOMTimerInterval(0.004);
72006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
721635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        didOneTimeInitialization = true;
722635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
723635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
7240617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    Page::PageClients pageClients;
7250617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    pageClients.chromeClient = new WebChromeClient(self);
7260617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    pageClients.contextMenuClient = new WebContextMenuClient(self);
7270617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    pageClients.editorClient = new WebEditorClient(self);
7280617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    pageClients.dragClient = new WebDragClient(self);
7290617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    pageClients.inspectorClient = new WebInspectorClient(self);
7300617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    pageClients.pluginHalterClient = new WebPluginHalterClient(self);
731d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(CLIENT_BASED_GEOLOCATION)
7326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    pageClients.geolocationClient = new WebGeolocationClient(self);
733d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
7345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if ENABLE(DEVICE_ORIENTATION)
7355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    pageClients.deviceOrientationClient = new WebDeviceOrientationClient(self);
7365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
7370617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    _private->page = new Page(pageClients);
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
739692e5dbf12901edacf14812a6fae25462920af42Steve Block    _private->page->setCanStartMedia([self window]);
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->page->settings()->setLocalStorageDatabasePath([[self preferences] _localStorageDatabasePath]);
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (needsOutlookQuirksScript()) {
7432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        _private->page->settings()->setShouldInjectUserScriptsInInitialEmptyDocument(true);
7442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        [self _injectOutlookQuirksScript];
7452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [WebFrame _createMainFrameWithPage:_private->page frameName:frameName frameView:frameView];
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
750563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    NSRunLoop *runLoop = [NSRunLoop mainRunLoop];
751563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#else
752563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
753563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif
754563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_LOADING_DURING_COMMON_RUNLOOP_MODES))
756563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        [self scheduleInRunLoop:runLoop forMode:(NSString *)kCFRunLoopCommonModes];
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
758563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        [self scheduleInRunLoop:runLoop forMode:NSDefaultRunLoopMode];
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _addToAllWebViewsSet];
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setGroupName:groupName];
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If there's already a next key view (e.g., from a nib), wire it up to our
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // contained frame view. In any case, wire our next key view up to the our
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // contained frame view. This works together with our becomeFirstResponder
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // and setNextKeyView overrides.
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView *nextKeyView = [self nextKeyView];
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (nextKeyView && nextKeyView != frameView)
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [frameView setNextKeyView:nextKeyView];
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super setNextKeyView:frameView];
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
772692e5dbf12901edacf14812a6fae25462920af42Steve Block    if ([[self class] shouldIncludeInWebKitStatistics])
773692e5dbf12901edacf14812a6fae25462920af42Steve Block        ++WebViewCount;
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _registerDraggedTypes];
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebPreferences *prefs = [self preferences];
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_preferencesChangedNotification:)
7792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                                                 name:WebPreferencesChangedInternalNotification object:prefs];
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    [self _preferencesChanged:[self preferences]];
7822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    [[self preferences] _postPreferencesChangedAPINotification];
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_LOCAL_RESOURCE_SECURITY_RESTRICTION)) {
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Originally, we allowed all local loads.
786231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SecurityOrigin::setLocalLoadPolicy(SecurityOrigin::AllowLocalLoadsForAll);
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (!WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_MORE_STRICT_LOCAL_RESOURCE_SECURITY_RESTRICTION)) {
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Later, we allowed local loads for local URLs and documents loaded
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // with substitute data.
790231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SecurityOrigin::setLocalLoadPolicy(SecurityOrigin::AllowLocalLoadsForLocalAndSubstituteData);
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITHOUT_CONTENT_SNIFFING_FOR_FILE_URLS))
7940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ResourceHandle::forceContentSniffing();
795ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
796a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if ENABLE(GLIB_SUPPORT)
797ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    [self _scheduleGlibContextIterations];
798ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif
799ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
800a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (runningTigerMail() || runningLeopardMail())
801a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        [self _injectMailQuirksScript];
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_initWithFrame:(NSRect)f frameName:(NSString *)frameName groupName:(NSString *)groupName usesDocumentViews:(BOOL)usesDocumentViews
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super initWithFrame:f];
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self)
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ENABLE_WEBKIT_UNSET_DYLD_FRAMEWORK_PATH
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // DYLD_FRAMEWORK_PATH is used so Safari will load the development version of WebKit, which
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // may not work with other WebKit applications.  Unsetting DYLD_FRAMEWORK_PATH removes the
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // need for Safari to unset it to prevent it from being passed to applications it launches.
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Unsetting it when a WebView is first created is as good a place as any.
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // See <http://bugs.webkit.org/show_bug.cgi?id=4286> for more details.
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (getenv("WEBKIT_UNSET_DYLD_FRAMEWORK_PATH")) {
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsetenv("DYLD_FRAMEWORK_PATH");
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsetenv("WEBKIT_UNSET_DYLD_FRAMEWORK_PATH");
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private = [[WebViewPrivate alloc] init];
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _commonInitializationWithFrameName:frameName groupName:groupName usesDocumentViews:usesDocumentViews];
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setMaintainsBackForwardList: YES];
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_mustDrawUnionedRect:(NSRect)rect singleRects:(const NSRect *)rects count:(NSInteger)count
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If count == 0 here, use the rect passed in for drawing. This is a workaround for:
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // <rdar://problem/3908282> REGRESSION (Mail): No drag image dragging selected text in Blot and Mail
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The reason for the workaround is that this method is called explicitly from the code
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // to generate a drag image, and at that time, getRectsBeingDrawn:count: will return a zero count.
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int cRectThreshold = 10;
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const float cWastedSpaceThreshold = 0.75f;
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL useUnionedRect = (count <= 1) || (count > cRectThreshold);
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!useUnionedRect) {
8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Attempt to guess whether or not we should use the unioned rect or the individual rects.
8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // We do this by computing the percentage of "wasted space" in the union.  If that wasted space
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // is too large, then we will do individual rect painting instead.
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float unionPixels = (rect.size.width * rect.size.height);
8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float singlePixels = 0;
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < count; ++i)
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            singlePixels += rects[i].size.width * rects[i].size.height;
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        float wastedSpace = 1 - (singlePixels / unionPixels);
8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (wastedSpace <= cWastedSpaceThreshold)
8478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            useUnionedRect = YES;
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return useUnionedRect;
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)drawSingleRect:(NSRect)rect
8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!_private->usesDocumentViews);
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [NSGraphicsContext saveGraphicsState];
8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRectClip(rect);
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    @try {
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[self mainFrame] _drawRect:rect contentsOnly:NO];
8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
86221939df44de1705786c545cd1bf519d47250322dBen Murdoch        [[self _UIDelegateForwarder] webView:self didDrawRect:rect];
8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
86421939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (WebNodeHighlight *currentHighlight = [self currentNodeHighlight])
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [currentHighlight setNeedsUpdateInTargetViewRect:rect];
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [NSGraphicsContext restoreGraphicsState];
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } @catch (NSException *localException) {
8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [NSGraphicsContext restoreGraphicsState];
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG_ERROR("Exception caught while drawing: %@", localException);
8718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [localException raise];
8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)isFlipped
8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return _private && !_private->usesDocumentViews;
8780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
8790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)setFrameSize:(NSSize)size
8810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
8820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!_private->usesDocumentViews && !NSEqualSizes(_private->lastLayoutSize, size)) {
8830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Frame* frame = [self _mainCoreFrame];
8840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // FIXME: Viewless WebKit is broken with Safari banners (e.g., the Find banner).  We'll have to figure out a way for
8850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Safari to communicate that this space is being consumed.  For WebKit with document views, there's no
8860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // need to do an explicit resize, since WebFrameViews have auto resizing turned on and will handle changing
8870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // their bounds automatically. See <rdar://problem/6835573> for details.
8880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        frame->view()->resize(IntSize(size));
8890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        frame->view()->setNeedsLayout();
8900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [self setNeedsDisplay:YES];
8910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        _private->lastLayoutSize = size;
8920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
8930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [super setFrameSize:size];
8950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
8960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(ACCELERATED_COMPOSITING) || !defined(BUILDING_ON_TIGER)
8980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_viewWillDrawInternal
9000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
9010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* frame = [self _mainCoreFrame];
9020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (frame && frame->view())
9035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        frame->view()->updateLayoutAndStyleIfNeededRecursive();
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
9070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)viewWillDraw
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!_private->usesDocumentViews)
9130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [self _viewWillDrawInternal];
9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super viewWillDraw];
9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)drawRect:(NSRect)rect
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private->usesDocumentViews)
9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [super drawRect:rect];
9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT_MAIN_THREAD();
9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const NSRect *rects;
9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSInteger count;
9298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self getRectsBeingDrawn:&rects count:&count];
9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([self _mustDrawUnionedRect:rect singleRects:rects count:count])
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self drawSingleRect:rect];
9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (int i = 0; i < count; ++i)
9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [self drawSingleRect:rects[i]];
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSArray *)_supportedMIMETypes
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Load the plug-in DB allowing plug-ins to install types.
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [WebPluginDatabase sharedDatabase];
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[WebFrameView _viewTypesAllowImageTypeOmission:NO] allKeys];
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSArray *)_supportedFileExtensions
9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableSet *extensions = [[NSMutableSet alloc] init];
9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray *MIMETypes = [self _supportedMIMETypes];
9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSEnumerator *enumerator = [MIMETypes objectEnumerator];
9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *MIMEType;
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((MIMEType = [enumerator nextObject]) != nil) {
9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSArray *extensionsForType = WKGetExtensionsForMIMEType(MIMEType);
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (extensionsForType) {
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [extensions addObjectsFromArray:extensionsForType];
9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray *uniqueExtensions = [extensions allObjects];
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [extensions release];
9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return uniqueExtensions;
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
96321939df44de1705786c545cd1bf519d47250322dBen Murdochstatic NSMutableSet *knownPluginMIMETypes()
96421939df44de1705786c545cd1bf519d47250322dBen Murdoch{
96521939df44de1705786c545cd1bf519d47250322dBen Murdoch    static NSMutableSet *mimeTypes = [[NSMutableSet alloc] init];
96621939df44de1705786c545cd1bf519d47250322dBen Murdoch
96721939df44de1705786c545cd1bf519d47250322dBen Murdoch    return mimeTypes;
96821939df44de1705786c545cd1bf519d47250322dBen Murdoch}
96921939df44de1705786c545cd1bf519d47250322dBen Murdoch
97021939df44de1705786c545cd1bf519d47250322dBen Murdoch+ (void)_registerPluginMIMEType:(NSString *)MIMEType
97121939df44de1705786c545cd1bf519d47250322dBen Murdoch{
97221939df44de1705786c545cd1bf519d47250322dBen Murdoch    [WebView registerViewClass:[WebHTMLView class] representationClass:[WebHTMLRepresentation class] forMIMEType:MIMEType];
97321939df44de1705786c545cd1bf519d47250322dBen Murdoch    [knownPluginMIMETypes() addObject:MIMEType];
97421939df44de1705786c545cd1bf519d47250322dBen Murdoch}
97521939df44de1705786c545cd1bf519d47250322dBen Murdoch
97621939df44de1705786c545cd1bf519d47250322dBen Murdoch+ (void)_unregisterPluginMIMEType:(NSString *)MIMEType
97721939df44de1705786c545cd1bf519d47250322dBen Murdoch{
97821939df44de1705786c545cd1bf519d47250322dBen Murdoch    [self _unregisterViewClassAndRepresentationClassForMIMEType:MIMEType];
97921939df44de1705786c545cd1bf519d47250322dBen Murdoch    [knownPluginMIMETypes() removeObject:MIMEType];
98021939df44de1705786c545cd1bf519d47250322dBen Murdoch}
98121939df44de1705786c545cd1bf519d47250322dBen Murdoch
982643ca7872b450ea4efacab6188849e5aac2ba161Steve Block+ (BOOL)_viewClass:(Class *)vClass andRepresentationClass:(Class *)rClass forMIMEType:(NSString *)MIMEType allowingPlugins:(BOOL)allowPlugins
9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    MIMEType = [MIMEType lowercaseString];
9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Class viewClass = [[WebFrameView _viewTypesAllowImageTypeOmission:YES] _webkit_objectForMIMEType:MIMEType];
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Class repClass = [[WebDataSource _repTypesAllowImageTypeOmission:YES] _webkit_objectForMIMEType:MIMEType];
987643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!viewClass || !repClass || [[WebPDFView supportedMIMETypes] containsObject:MIMEType]) {
9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Our optimization to avoid loading the plug-in DB and image types for the HTML case failed.
990643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
991643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (allowPlugins) {
992643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // Load the plug-in DB allowing plug-ins to install types.
993643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            [WebPluginDatabase sharedDatabase];
994643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
995643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Load the image types and get the view class and rep class. This should be the fullest picture of all handled types.
9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        viewClass = [[WebFrameView _viewTypesAllowImageTypeOmission:NO] _webkit_objectForMIMEType:MIMEType];
9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        repClass = [[WebDataSource _repTypesAllowImageTypeOmission:NO] _webkit_objectForMIMEType:MIMEType];
9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (viewClass && repClass) {
100221939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (viewClass == [WebHTMLView class] && repClass == [WebHTMLRepresentation class]) {
100321939df44de1705786c545cd1bf519d47250322dBen Murdoch            // Special-case WebHTMLView for text types that shouldn't be shown.
100421939df44de1705786c545cd1bf519d47250322dBen Murdoch            if ([[WebHTMLView unsupportedTextMIMETypes] containsObject:MIMEType])
100521939df44de1705786c545cd1bf519d47250322dBen Murdoch                return NO;
100621939df44de1705786c545cd1bf519d47250322dBen Murdoch
100721939df44de1705786c545cd1bf519d47250322dBen Murdoch            // If the MIME type is a known plug-in we might not want to load it.
100821939df44de1705786c545cd1bf519d47250322dBen Murdoch            if (!allowPlugins && [knownPluginMIMETypes() containsObject:MIMEType]) {
100921939df44de1705786c545cd1bf519d47250322dBen Murdoch                BOOL isSupportedByWebKit = [[WebHTMLView supportedNonImageMIMETypes] containsObject:MIMEType] ||
101021939df44de1705786c545cd1bf519d47250322dBen Murdoch                    [[WebHTMLView supportedMIMETypes] containsObject:MIMEType];
101121939df44de1705786c545cd1bf519d47250322dBen Murdoch
101221939df44de1705786c545cd1bf519d47250322dBen Murdoch                // If this is a known plug-in MIME type and WebKit can't show it natively, we don't want to show it.
101321939df44de1705786c545cd1bf519d47250322dBen Murdoch                if (!isSupportedByWebKit)
101421939df44de1705786c545cd1bf519d47250322dBen Murdoch                    return NO;
101521939df44de1705786c545cd1bf519d47250322dBen Murdoch            }
10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (vClass)
10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *vClass = viewClass;
10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (rClass)
10208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            *rClass = repClass;
10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return YES;
10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NO;
10258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1027563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)_viewClass:(Class *)vClass andRepresentationClass:(Class *)rClass forMIMEType:(NSString *)MIMEType
10288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
102921939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ([[self class] _viewClass:vClass andRepresentationClass:rClass forMIMEType:MIMEType allowingPlugins:[_private->preferences arePlugInsEnabled]])
10308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return YES;
10318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->pluginDatabase) {
10338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebBasePluginPackage *pluginPackage = [_private->pluginDatabase pluginForMIMEType:MIMEType];
10348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (pluginPackage) {
10358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (vClass)
10368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                *vClass = [WebHTMLView class];
10378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (rClass)
10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                *rClass = [WebHTMLRepresentation class];
10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return YES;
10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NO;
10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)_setAlwaysUseATSU:(BOOL)f
10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _setAlwaysUsesComplexTextCodePath:f];
10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)_setAlwaysUsesComplexTextCodePath:(BOOL)f
10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Font::setCodePath(f ? Font::Complex : Font::Auto);
10540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch+ (BOOL)canCloseAllWebViews
10570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return DOMWindow::dispatchAllPendingBeforeUnloadEvents();
10590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
10600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch+ (void)closeAllWebViews
10620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    DOMWindow::dispatchAllPendingUnloadEvents();
10640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
10650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // This will close the WebViews in a random order. Change this if close order is important.
106621939df44de1705786c545cd1bf519d47250322dBen Murdoch    // Make a new set to avoid mutating the set we are enumerating.
106721939df44de1705786c545cd1bf519d47250322dBen Murdoch    NSSet *webViewsToClose = [NSSet setWithSet:(NSSet *)allWebViewsSet];
106821939df44de1705786c545cd1bf519d47250322dBen Murdoch    NSEnumerator *enumerator = [webViewsToClose objectEnumerator];
10690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    while (WebView *webView = [enumerator nextObject])
10700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [webView close];
10718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (BOOL)canShowFile:(NSString *)path
10748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[self class] canShowMIMEType:[WebView _MIMETypeForFile:path]];
10768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSString *)suggestedFileExtensionForMIMEType:(NSString *)type
10798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return WKGetPreferredExtensionForMIMEType(type);
10818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_isClosed
10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !_private || _private->closed;
10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_closePluginDatabases
10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    pluginDatabaseClientCount--;
10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Close both sets of plug-in databases because plug-ins need an opportunity to clean up files, etc.
10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Unload the WebView local plug-in database.
10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->pluginDatabase) {
10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_private->pluginDatabase destroyAllPluginInstanceViews];
10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_private->pluginDatabase close];
10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_private->pluginDatabase release];
10998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->pluginDatabase = nil;
11008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Keep the global plug-in database active until the app terminates to avoid having to reload plug-in bundles.
11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!pluginDatabaseClientCount && applicationIsTerminating)
11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [WebPluginDatabase closeSharedDatabase];
11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_closeWithFastTeardown
11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WTF::RefCountedLeakCounter::suppressMessages("At least one WebView was closed with fast teardown.");
11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [[NSDistributedNotificationCenter defaultCenter] removeObserver:self];
11140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [[NSNotificationCenter defaultCenter] removeObserver:self];
11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _closePluginDatabases];
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic bool fastDocumentTeardownEnabled()
11200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
11210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifdef NDEBUG
11220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static bool enabled = ![[NSUserDefaults standardUserDefaults] boolForKey:WebKitEnableFullDocumentTeardownPreferenceKey];
11230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
11240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static bool initialized = false;
11250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static bool enabled = false;
11260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!initialized) {
11270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // This allows debug builds to default to not have fast teardown, so leak checking still works.
11280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // But still allow the WebKitEnableFullDocumentTeardown default to override it if present.
11290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        NSNumber *setting = [[NSUserDefaults standardUserDefaults] objectForKey:WebKitEnableFullDocumentTeardownPreferenceKey];
11300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (setting)
11310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            enabled = ![setting boolValue];
11320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        initialized = true;
11330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
11340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
11350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return enabled;
11360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
11370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// _close is here only for backward compatibility; clients and subclasses should use
11398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// public method -close instead.
11408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_close
11418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private || _private->closed)
11438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
11448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _private->closed = YES;
114621939df44de1705786c545cd1bf519d47250322dBen Murdoch    [self _removeFromAllWebViewsSet];
1147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1148cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    [self _closingEventHandling];
11490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WTF::RefCountedLeakCounter::cancelMessageSuppression(webViewIsOpen);
11528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
11530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // To quit the apps fast we skip document teardown, except plugins
11550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // need to be destroyed and unloaded.
11560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (applicationIsTerminating && fastDocumentTeardownEnabled()) {
11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _closeWithFastTeardown];
11588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
11598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1161d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(VIDEO)
1162231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    [self _exitFullscreen];
1163d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
1164231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
11650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (Frame* mainFrame = [self _mainCoreFrame])
11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        mainFrame->loader()->detachFromParent();
11678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setHostWindow:nil];
11698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setDownloadDelegate:nil];
11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setEditingDelegate:nil];
11728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setFrameLoadDelegate:nil];
11738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setPolicyDelegate:nil];
11748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setResourceLoadDelegate:nil];
11758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setScriptDebugDelegate:nil];
11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setUIDelegate:nil];
11778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private->inspector webViewClosed];
11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // To avoid leaks, call removeDragCaret in case it wasn't called after moveDragCaretToPoint.
11818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self removeDragCaret];
11828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Deleteing the WebCore::Page will clear the page cache so we call destroy on
11848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // all the plug-ins in the page cache to break any retain cycles.
11858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // See comment in HistoryItem::releaseAllPendingPageCaches() for more information.
11866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    Page* page = _private->page;
11878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->page = 0;
11886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    delete page;
11898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->hasSpellCheckerDocumentTag) {
11918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSSpellChecker sharedSpellChecker] closeSpellDocumentWithTag:_private->spellCheckerDocumentTag];
11928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->hasSpellCheckerDocumentTag = NO;
11938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
11950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
11960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [self _clearLayerSyncLoopObserver];
11970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1199a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if ENABLE(GLIB_SUPPORT)
1200ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    [self _clearGlibLoopObserver];
1201ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif
1202ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
12038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSDistributedNotificationCenter defaultCenter] removeObserver:self];
12048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSNotificationCenter defaultCenter] removeObserver:self];
12058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [WebPreferences _removeReferenceForIdentifier:[self preferencesIdentifier]];
12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebPreferences *preferences = _private->preferences;
12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->preferences = nil;
12108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences didRemoveFromWebView];
12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [preferences release];
12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _closePluginDatabases];
12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Need this to make leak messages accurate.
1217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (applicationIsTerminating) {
12188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        gcController().garbageCollectNow();
1219563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        [WebCache setDisabled:YES];
1220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
12218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
12228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// Indicates if the WebView is in the midst of a user gesture.
12250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)_isProcessingUserGesture
12260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
12270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebFrame *frame = [self mainFrame];
12280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return core(frame)->loader()->isProcessingUserGesture();
12290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
12300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSString *)_MIMETypeForFile:(NSString *)path
12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *extension = [path pathExtension];
12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *MIMEType = nil;
12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the MIME type from the extension.
12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([extension length] != 0) {
12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        MIMEType = WKGetMIMETypeForExtension(extension);
12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we can't get a known MIME type from the extension, sniff.
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([MIMEType length] == 0 || [MIMEType isEqualToString:@"application/octet-stream"]) {
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:path];
12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSData *data = [handle readDataOfLength:WEB_GUESS_MIME_TYPE_PEEK_LENGTH];
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [handle closeFile];
12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([data length] != 0) {
12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            MIMEType = [data _webkit_guessedMIMEType];
12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([MIMEType length] == 0) {
12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            MIMEType = @"application/octet-stream";
12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return MIMEType;
12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebDownload *)_downloadURL:(NSURL *)URL
12588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(URL);
12608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:URL];
12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebDownload *download = [WebDownload _downloadWithRequest:request
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                     delegate:_private->downloadDelegate
12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                    directory:nil];
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [request release];
12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return download;
12688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebView *)_openNewWindowWithRequest:(NSURLRequest *)request
12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSDictionary *features = [[NSDictionary alloc] init];
12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView *newWindowWebView = [[self _UIDelegateForwarder] webView:self
12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                            createWebViewWithRequest:nil
12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                      windowFeatures:features];
12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [features release];
12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!newWindowWebView)
12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallUIDelegate(newWindowWebView, @selector(webViewShow:));
12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return newWindowWebView;
12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebInspector *)inspector
12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->inspector)
12878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->inspector = [[WebInspector alloc] initWithWebView:self];
12888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->inspector;
12898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebCore::Page*)page
12928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->page;
12948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSMenu *)_menuForElement:(NSDictionary *)element defaultItems:(NSArray *)items
12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray *defaultMenuItems = [[WebDefaultUIDelegate sharedUIDelegate] webView:self contextMenuItemsForElement:element defaultMenuItems:items];
12992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    NSArray *menuItems = defaultMenuItems;
13002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // CallUIDelegate returns nil if UIDelegate is nil or doesn't respond to the selector. So we need to check that here
13022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // to distinguish between using defaultMenuItems or the delegate really returning nil to say "no context menu".
13032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    SEL selector = @selector(webView:contextMenuItemsForElement:defaultMenuItems:);
13042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (_private->UIDelegate && [_private->UIDelegate respondsToSelector:selector]) {
13052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        menuItems = CallUIDelegate(self, selector, element, defaultMenuItems);
13062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!menuItems)
13072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return nil;
13082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned count = [menuItems count];
13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!count)
13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMenu *menu = [[NSMenu alloc] init];
13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned i = 0; i < count; i++)
13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [menu addItem:[menuItems objectAtIndex:i]];
13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [menu autorelease];
13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_mouseDidMoveOverElement:(NSDictionary *)dictionary modifierFlags:(NSUInteger)modifierFlags
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We originally intended to call this delegate method sometimes with a nil dictionary, but due to
13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // a bug dating back to WebKit 1.0 this delegate was never called with nil! Unfortunately we can't
13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // start calling this with nil since it will break Adobe Help Viewer, and possibly other clients.
13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!dictionary)
13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallUIDelegate(self, @selector(webView:mouseDidMoveOverElement:modifierFlags:), dictionary, modifierFlags);
13298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_loadBackForwardListFromOtherView:(WebView *)otherView
13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
13348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!otherView->_private->page)
13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // It turns out the right combination of behavior is done with the back/forward load
13408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // type.  (See behavior matrix at the top of WebFramePrivate.)  So we copy all the items
13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // in the back forward list, and go to the current one.
13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BackForwardList* backForwardList = _private->page->backForwardList();
13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!backForwardList->currentItem()); // destination list should be empty
13458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BackForwardList* otherBackForwardList = otherView->_private->page->backForwardList();
13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!otherBackForwardList->currentItem())
13488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return; // empty back forward list, bail
13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HistoryItem* newItemToGoTo = 0;
13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int lastItemIndex = otherBackForwardList->forwardListCount();
13538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (int i = -otherBackForwardList->backListCount(); i <= lastItemIndex; ++i) {
13548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i == 0) {
13558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // If this item is showing , save away its current scroll and form state,
13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // since that might have changed since loading and it is normally not saved
13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // until we leave that page.
1358cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            otherView->_private->page->mainFrame()->loader()->history()->saveDocumentAndScrollState();
13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<HistoryItem> newItem = otherBackForwardList->itemAtIndex(i)->copy();
13618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i == 0)
13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            newItemToGoTo = newItem.get();
13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        backForwardList->addItem(newItem.release());
13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(newItemToGoTo);
13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->page->goToItem(newItemToGoTo, FrameLoadTypeIndexedBackForward);
13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setFormDelegate: (id<WebFormDelegate>)delegate
13718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->formDelegate = delegate;
13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id<WebFormDelegate>)_formDelegate
13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->formDelegate;
13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_needsAdobeFrameReloadingQuirk
13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static BOOL needsQuirk = WKAppVersionCheckLessThan(@"com.adobe.Acrobat", -1, 9.0)
13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        || WKAppVersionCheckLessThan(@"com.adobe.Acrobat.Pro", -1, 9.0)
13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        || WKAppVersionCheckLessThan(@"com.adobe.Reader", -1, 9.0)
13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        || WKAppVersionCheckLessThan(@"com.adobe.distiller", -1, 9.0)
13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        || WKAppVersionCheckLessThan(@"com.adobe.Contribute", -1, 4.2)
13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        || WKAppVersionCheckLessThan(@"com.adobe.dreamweaver-9.0", -1, 9.1)
13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        || WKAppVersionCheckLessThan(@"com.macromedia.fireworks", -1, 9.1)
13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        || WKAppVersionCheckLessThan(@"com.adobe.InCopy", -1, 5.1)
13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        || WKAppVersionCheckLessThan(@"com.adobe.InDesign", -1, 5.1)
13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        || WKAppVersionCheckLessThan(@"com.adobe.Soundbooth", -1, 2);
13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return needsQuirk;
13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)_needsLinkElementTextCSSQuirk
13978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static BOOL needsQuirk = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITHOUT_LINK_ELEMENT_TEXT_CSS_QUIRK)
13990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        && WKAppVersionCheckLessThan(@"com.e-frontier.shade10", -1, 10.6);
14000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return needsQuirk;
14010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)_needsKeyboardEventDisambiguationQuirks
14040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
14050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static BOOL needsQuirks = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_IE_COMPATIBLE_KEYBOARD_EVENT_DISPATCH) && !applicationIsSafari();
14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return needsQuirks;
14078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)_needsFrameLoadDelegateRetainQuirk
14100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
14110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static BOOL needsQuirk = WKAppVersionCheckLessThan(@"com.equinux.iSale5", -1, 5.6);
14120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return needsQuirk;
14130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
14140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1415bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1416bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen- (BOOL)_needsPreHTML5ParserQuirks
1417bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1418bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // AOL Instant Messenger and Microsoft My Day contain markup incompatible
1419bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // with the new HTML5 parser. If these applications were linked against a
1420bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // version of WebKit prior to the introduction of the HTML5 parser, enable
1421bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // parser quirks to maintain compatibility. For details, see
1422bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // <https://bugs.webkit.org/show_bug.cgi?id=46134> and
1423bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // <https://bugs.webkit.org/show_bug.cgi?id=46334>.
1424bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    static bool isApplicationNeedingParserQuirks = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_HTML5_PARSER)
1425bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        && (applicationIsAOLInstantMessenger() || applicationIsMicrosoftMyDay());
1426f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1427f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Mail.app must continue to display HTML email that contains quirky markup.
1428f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    static bool isAppleMail = applicationIsAppleMail();
1429bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1430bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return isApplicationNeedingParserQuirks
1431f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        || isAppleMail
1432bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if ENABLE(DASHBOARD_SUPPORT)
1433bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // Pre-HTML5 parser quirks are required to remain compatible with many
1434bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // Dashboard widgets. See <rdar://problem/8175982>.
1435bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        || (_private->page && _private->page->settings()->usesDashboardBackwardCompatibilityMode())
1436bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#endif
1437bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        || [[self preferences] usePreHTML5ParserQuirks];
1438bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1439bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1440e14391e94c850b8bd03680c23b38978db68687a8John Reck- (BOOL)_needsUnrestrictedGetMatchedCSSRules
1441e14391e94c850b8bd03680c23b38978db68687a8John Reck{
1442e14391e94c850b8bd03680c23b38978db68687a8John Reck    static bool needsUnrestrictedGetMatchedCSSRules = !WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITH_GET_MATCHED_CSS_RULES_RESTRICTIONS) && applicationIsSafari();
1443e14391e94c850b8bd03680c23b38978db68687a8John Reck    return needsUnrestrictedGetMatchedCSSRules;
1444e14391e94c850b8bd03680c23b38978db68687a8John Reck}
1445e14391e94c850b8bd03680c23b38978db68687a8John Reck
14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_preferencesChangedNotification:(NSNotification *)notification
14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebPreferences *preferences = (WebPreferences *)[notification object];
14492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    [self _preferencesChanged:preferences];
14502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
14512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)_preferencesChanged:(WebPreferences *)preferences
14532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(preferences == [self preferences]);
14558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->userAgentOverridden)
14568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->userAgent = String();
14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cache this value so we don't have to read NSUserDefaults on each page load
14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->useSiteSpecificSpoofing = [preferences _useSiteSpecificSpoofing];
14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Update corresponding WebCore Settings object.
14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Settings* settings = _private->page->settings();
14668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setCursiveFontFamily([preferences cursiveFontFamily]);
14688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setDefaultFixedFontSize([preferences defaultFixedFontSize]);
14698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setDefaultFontSize([preferences defaultFontSize]);
14708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setDefaultTextEncodingName([preferences defaultTextEncodingName]);
1471563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    settings->setUsesEncodingDetector([preferences usesEncodingDetector]);
14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setFantasyFontFamily([preferences fantasyFontFamily]);
14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setFixedFontFamily([preferences fixedFontFamily]);
14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setForceFTPDirectoryListings([preferences _forceFTPDirectoryListings]);
14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setFTPDirectoryTemplatePath([preferences _ftpDirectoryTemplatePath]);
14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setLocalStorageDatabasePath([preferences _localStorageDatabasePath]);
14778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setJavaEnabled([preferences isJavaEnabled]);
14788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setJavaScriptEnabled([preferences isJavaScriptEnabled]);
1479563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    settings->setWebSecurityEnabled([preferences isWebSecurityEnabled]);
1480563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    settings->setAllowUniversalAccessFromFileURLs([preferences allowUniversalAccessFromFileURLs]);
1481692e5dbf12901edacf14812a6fae25462920af42Steve Block    settings->setAllowFileAccessFromFileURLs([preferences allowFileAccessFromFileURLs]);
14828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setJavaScriptCanOpenWindowsAutomatically([preferences javaScriptCanOpenWindowsAutomatically]);
14838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setMinimumFontSize([preferences minimumFontSize]);
14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setMinimumLogicalFontSize([preferences minimumLogicalFontSize]);
14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setPluginsEnabled([preferences arePlugInsEnabled]);
1486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(DATABASE)
148706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    AbstractDatabase::setIsAvailable([preferences databasesEnabled]);
1488dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
1489635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    settings->setLocalStorageEnabled([preferences localStorageEnabled]);
1490231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    settings->setExperimentalNotificationsEnabled([preferences experimentalNotificationsEnabled]);
14918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setPrivateBrowsingEnabled([preferences privateBrowsingEnabled]);
14928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setSansSerifFontFamily([preferences sansSerifFontFamily]);
14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setSerifFontFamily([preferences serifFontFamily]);
14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setStandardFontFamily([preferences standardFontFamily]);
14958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setLoadsImagesAutomatically([preferences loadsImagesAutomatically]);
14962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    settings->setLoadsSiteIconsIgnoringImageLoadingSetting([preferences loadsSiteIconsIgnoringImageLoadingPreference]);
14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setShouldPrintBackgrounds([preferences shouldPrintBackgrounds]);
14988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setTextAreasAreResizable([preferences textAreasAreResizable]);
14998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setShrinksStandaloneImagesToFit([preferences shrinksStandaloneImagesToFit]);
15008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setEditableLinkBehavior(core([preferences editableLinkBehavior]));
1501545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    settings->setEditingBehaviorType(core([preferences editingBehavior]));
1502635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    settings->setTextDirectionSubmenuInclusionBehavior(core([preferences textDirectionSubmenuInclusionBehavior]));
15038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setDOMPasteAllowed([preferences isDOMPasteAllowed]);
15048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setUsesPageCache([self usesPageCache]);
15058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setShowsURLsInToolTips([preferences showsURLsInToolTips]);
15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setDeveloperExtrasEnabled([preferences developerExtrasEnabled]);
15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setAuthorAndUserStylesEnabled([preferences authorAndUserStylesEnabled]);
15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setApplicationChromeMode([preferences applicationChromeModeEnabled]);
15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([preferences userStyleSheetEnabled]) {
15108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSString* location = [[preferences userStyleSheetLocation] _web_originalDataAsString];
1511d0825bca7fe65beaee391d30da42e937db621564Steve Block        if ([location isEqualToString:@"apple-dashboard://stylesheet"])
1512d0825bca7fe65beaee391d30da42e937db621564Steve Block            location = @"file:///System/Library/PrivateFrameworks/DashboardClient.framework/Resources/widget.css";
15138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        settings->setUserStyleSheetLocation([NSURL URLWithString:(location ? location : @"")]);
15148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else
15158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        settings->setUserStyleSheetLocation([NSURL URLWithString:@""]);
15168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setNeedsAdobeFrameReloadingQuirk([self _needsAdobeFrameReloadingQuirk]);
15170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    settings->setTreatsAnyTextCSSLinkAsStylesheet([self _needsLinkElementTextCSSQuirk]);
15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setNeedsKeyboardEventDisambiguationQuirks([self _needsKeyboardEventDisambiguationQuirks]);
1519563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    settings->setNeedsLeopardMailQuirks(runningLeopardMail());
1520563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    settings->setNeedsTigerMailQuirks(runningTigerMail());
15218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setNeedsSiteSpecificQuirks(_private->useSiteSpecificSpoofing);
15228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setWebArchiveDebugModeEnabled([preferences webArchiveDebugModeEnabled]);
15230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    settings->setLocalFileContentSniffingEnabled([preferences localFileContentSniffingEnabled]);
15248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    settings->setOfflineWebApplicationCacheEnabled([preferences offlineWebApplicationCacheEnabled]);
152521939df44de1705786c545cd1bf519d47250322dBen Murdoch    settings->setJavaScriptCanAccessClipboard([preferences javaScriptCanAccessClipboard]);
15260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    settings->setXSSAuditorEnabled([preferences isXSSAuditorEnabled]);
15275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    settings->setEnforceCSSMIMETypeInNoQuirksMode(!WKAppVersionCheckLessThan(@"com.apple.iWeb", -1, 2.1));
1528ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    settings->setDNSPrefetchingEnabled([preferences isDNSPrefetchingEnabled]);
1529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // FIXME: Enabling accelerated compositing when WebGL is enabled causes tests to fail on Leopard which expect HW compositing to be disabled.
1531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Until we fix that, I will comment out the test (CFM)
153268513a70bcd92384395513322f1b801e7bf9c729Steve Block    settings->setAcceleratedCompositingEnabled((coreVideoHas7228836Fix() || [preferences webGLEnabled] ||
153368513a70bcd92384395513322f1b801e7bf9c729Steve Block        [preferences accelerated2dCanvasEnabled]) && [preferences acceleratedCompositingEnabled]);
15342bde8e466a4451c7319e3a072d118917957d6554Steve Block    settings->setAcceleratedDrawingEnabled([preferences acceleratedDrawingEnabled]);
15352bde8e466a4451c7319e3a072d118917957d6554Steve Block    settings->setCanvasUsesAcceleratedDrawing([preferences canvasUsesAcceleratedDrawing]);
1536643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    settings->setShowDebugBorders([preferences showDebugBorders]);
1537643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    settings->setShowRepaintCounter([preferences showRepaintCounter]);
1538231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    settings->setPluginAllowedRunTime([preferences pluginAllowedRunTime]);
1539ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    settings->setWebAudioEnabled([preferences webAudioEnabled]);
1540231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    settings->setWebGLEnabled([preferences webGLEnabled]);
154168513a70bcd92384395513322f1b801e7bf9c729Steve Block    settings->setAccelerated2dCanvasEnabled([preferences accelerated2dCanvasEnabled]);
1542d0825bca7fe65beaee391d30da42e937db621564Steve Block    settings->setLoadDeferringEnabled(shouldEnableLoadDeferring());
1543dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    settings->setFrameFlatteningEnabled([preferences isFrameFlatteningEnabled]);
1544a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    settings->setSpatialNavigationEnabled([preferences isSpatialNavigationEnabled]);
1545545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    settings->setPaginateDuringLayoutEnabled([preferences paginateDuringLayoutEnabled]);
15465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if ENABLE(FULLSCREEN_API)
15475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    settings->setFullScreenEnabled([preferences fullScreenEnabled]);
15485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
1549f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
1550f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Asynchronous spell checking API is available for 10.6 or later.
1551f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    settings->setAsynchronousSpellCheckingEnabled([preferences asynchronousSpellCheckingEnabled]);
1552f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
1553967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    settings->setMemoryInfoEnabled([preferences memoryInfoEnabled]);
1554bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    settings->setHyperlinkAuditingEnabled([preferences hyperlinkAuditingEnabled]);
1555bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    settings->setUsePreHTML5ParserQuirks([self _needsPreHTML5ParserQuirks]);
15562bde8e466a4451c7319e3a072d118917957d6554Steve Block    settings->setUseQuickLookResourceCachingQuirks([preferences useQuickLookResourceCachingQuirks]);
1557e14391e94c850b8bd03680c23b38978db68687a8John Reck    settings->setCrossOriginCheckInGetMatchedCSSRulesDisabled([self _needsUnrestrictedGetMatchedCSSRules]);
15582bde8e466a4451c7319e3a072d118917957d6554Steve Block    settings->setInteractiveFormValidationEnabled([self interactiveFormValidationEnabled]);
15592bde8e466a4451c7319e3a072d118917957d6554Steve Block    settings->setValidationMessageTimerMagnification([self validationMessageTimerMagnification]);
1560db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
1561db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    // Application Cache Preferences are stored on the global cache storage manager, not in Settings.
1562db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    [WebApplicationCache setDefaultOriginQuota:[preferences applicationCacheDefaultOriginQuota]];
156368513a70bcd92384395513322f1b801e7bf9c729Steve Block
156468513a70bcd92384395513322f1b801e7bf9c729Steve Block    BOOL zoomsTextOnly = [preferences zoomsTextOnly];
156568513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (_private->zoomsTextOnly != zoomsTextOnly)
156668513a70bcd92384395513322f1b801e7bf9c729Steve Block        [self _setZoomMultiplier:_private->zoomMultiplier isTextOnly:zoomsTextOnly];
15678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline IMP getMethod(id o, SEL s)
15708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [o respondsToSelector:s] ? [o methodForSelector:s] : 0;
15728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
15738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_cacheResourceLoadDelegateImplementations
15758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
15768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebResourceDelegateImplementationCache *cache = &_private->resourceLoadDelegateImplementations;
15778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id delegate = _private->resourceProgressDelegate;
15788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!delegate) {
15808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bzero(cache, sizeof(WebResourceDelegateImplementationCache));
15818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
15828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
15838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didCancelAuthenticationChallengeFunc = getMethod(delegate, @selector(webView:resource:didReceiveAuthenticationChallenge:fromDataSource:));
15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didFailLoadingWithErrorFromDataSourceFunc = getMethod(delegate, @selector(webView:resource:didFailLoadingWithError:fromDataSource:));
15868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didFinishLoadingFromDataSourceFunc = getMethod(delegate, @selector(webView:resource:didFinishLoadingFromDataSource:));
15878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didLoadResourceFromMemoryCacheFunc = getMethod(delegate, @selector(webView:didLoadResourceFromMemoryCache:response:length:fromDataSource:));
15888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didReceiveAuthenticationChallengeFunc = getMethod(delegate, @selector(webView:resource:didReceiveAuthenticationChallenge:fromDataSource:));
158921939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
159021939df44de1705786c545cd1bf519d47250322dBen Murdoch    cache->canAuthenticateAgainstProtectionSpaceFunc = getMethod(delegate, @selector(webView:resource:canAuthenticateAgainstProtectionSpace:forDataSource:));
159121939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
15928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didReceiveContentLengthFunc = getMethod(delegate, @selector(webView:resource:didReceiveContentLength:fromDataSource:));
15938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didReceiveResponseFunc = getMethod(delegate, @selector(webView:resource:didReceiveResponse:fromDataSource:));
15948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->identifierForRequestFunc = getMethod(delegate, @selector(webView:identifierForInitialRequest:fromDataSource:));
15958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->plugInFailedWithErrorFunc = getMethod(delegate, @selector(webView:plugInFailedWithError:dataSource:));
15968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->willCacheResponseFunc = getMethod(delegate, @selector(webView:resource:willCacheResponse:fromDataSource:));
15978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->willSendRequestFunc = getMethod(delegate, @selector(webView:resource:willSendRequest:redirectResponse:fromDataSource:));
1598635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    cache->shouldUseCredentialStorageFunc = getMethod(delegate, @selector(webView:resource:shouldUseCredentialStorageForDataSource:));
159981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    cache->shouldPaintBrokenImageForURLFunc = getMethod(delegate, @selector(webView:shouldPaintBrokenImageForURL:));
16008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_cacheFrameLoadDelegateImplementations
16038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrameLoadDelegateImplementationCache *cache = &_private->frameLoadDelegateImplementations;
16058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id delegate = _private->frameLoadDelegate;
16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!delegate) {
16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bzero(cache, sizeof(WebFrameLoadDelegateImplementationCache));
16098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
16118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didCancelClientRedirectForFrameFunc = getMethod(delegate, @selector(webView:didCancelClientRedirectForFrame:));
16138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didChangeLocationWithinPageForFrameFunc = getMethod(delegate, @selector(webView:didChangeLocationWithinPageForFrame:));
1614643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    cache->didPushStateWithinPageForFrameFunc = getMethod(delegate, @selector(webView:didPushStateWithinPageForFrame:));
1615643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    cache->didReplaceStateWithinPageForFrameFunc = getMethod(delegate, @selector(webView:didReplaceStateWithinPageForFrame:));
1616643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    cache->didPopStateWithinPageForFrameFunc = getMethod(delegate, @selector(webView:didPopStateWithinPageForFrame:));
16178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didClearWindowObjectForFrameFunc = getMethod(delegate, @selector(webView:didClearWindowObject:forFrame:));
1618643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    cache->didClearWindowObjectForFrameInScriptWorldFunc = getMethod(delegate, @selector(webView:didClearWindowObjectForFrame:inScriptWorld:));
16190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    cache->didClearInspectorWindowObjectForFrameFunc = getMethod(delegate, @selector(webView:didClearInspectorWindowObject:forFrame:));
16208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didCommitLoadForFrameFunc = getMethod(delegate, @selector(webView:didCommitLoadForFrame:));
16218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didFailLoadWithErrorForFrameFunc = getMethod(delegate, @selector(webView:didFailLoadWithError:forFrame:));
16228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didFailProvisionalLoadWithErrorForFrameFunc = getMethod(delegate, @selector(webView:didFailProvisionalLoadWithError:forFrame:));
16238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didFinishDocumentLoadForFrameFunc = getMethod(delegate, @selector(webView:didFinishDocumentLoadForFrame:));
16248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didFinishLoadForFrameFunc = getMethod(delegate, @selector(webView:didFinishLoadForFrame:));
16258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didFirstLayoutInFrameFunc = getMethod(delegate, @selector(webView:didFirstLayoutInFrame:));
1626635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    cache->didFirstVisuallyNonEmptyLayoutInFrameFunc = getMethod(delegate, @selector(webView:didFirstVisuallyNonEmptyLayoutInFrame:));
16278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didHandleOnloadEventsForFrameFunc = getMethod(delegate, @selector(webView:didHandleOnloadEventsForFrame:));
16288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didReceiveIconForFrameFunc = getMethod(delegate, @selector(webView:didReceiveIcon:forFrame:));
16298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didReceiveServerRedirectForProvisionalLoadForFrameFunc = getMethod(delegate, @selector(webView:didReceiveServerRedirectForProvisionalLoadForFrame:));
16308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didReceiveTitleForFrameFunc = getMethod(delegate, @selector(webView:didReceiveTitle:forFrame:));
16318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->didStartProvisionalLoadForFrameFunc = getMethod(delegate, @selector(webView:didStartProvisionalLoadForFrame:));
16328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->willCloseFrameFunc = getMethod(delegate, @selector(webView:willCloseFrame:));
16338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->willPerformClientRedirectToURLDelayFireDateForFrameFunc = getMethod(delegate, @selector(webView:willPerformClientRedirectToURL:delay:fireDate:forFrame:));
16348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    cache->windowScriptObjectAvailableFunc = getMethod(delegate, @selector(webView:windowScriptObjectAvailable:));
1635231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    cache->didDisplayInsecureContentFunc = getMethod(delegate, @selector(webViewDidDisplayInsecureContent:));
1636231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    cache->didRunInsecureContentFunc = getMethod(delegate, @selector(webView:didRunInsecureContent:));
16378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1639563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)_cacheScriptDebugDelegateImplementations
1640563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1641563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebScriptDebugDelegateImplementationCache *cache = &_private->scriptDebugDelegateImplementations;
1642563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    id delegate = _private->scriptDebugDelegate;
1643563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1644563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!delegate) {
1645563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        bzero(cache, sizeof(WebScriptDebugDelegateImplementationCache));
1646563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
1647563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
1648563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1649563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    cache->didParseSourceFunc = getMethod(delegate, @selector(webView:didParseSource:baseLineNumber:fromURL:sourceId:forWebFrame:));
1650563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (cache->didParseSourceFunc)
1651563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        cache->didParseSourceExpectsBaseLineNumber = YES;
1652ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    else {
1653ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        cache->didParseSourceExpectsBaseLineNumber = NO;
1654563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        cache->didParseSourceFunc = getMethod(delegate, @selector(webView:didParseSource:fromURL:sourceId:forWebFrame:));
1655ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
1656563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1657563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    cache->failedToParseSourceFunc = getMethod(delegate, @selector(webView:failedToParseSource:baseLineNumber:fromURL:withError:forWebFrame:));
1658563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    cache->didEnterCallFrameFunc = getMethod(delegate, @selector(webView:didEnterCallFrame:sourceId:line:forWebFrame:));
1659563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    cache->willExecuteStatementFunc = getMethod(delegate, @selector(webView:willExecuteStatement:sourceId:line:forWebFrame:));
1660563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    cache->willLeaveCallFrameFunc = getMethod(delegate, @selector(webView:willLeaveCallFrame:sourceId:line:forWebFrame:));
1661ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1662ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    cache->exceptionWasRaisedFunc = getMethod(delegate, @selector(webView:exceptionWasRaised:hasHandler:sourceId:line:forWebFrame:));
1663ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (cache->exceptionWasRaisedFunc)
1664ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        cache->exceptionWasRaisedExpectsHasHandlerFlag = YES;
1665ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    else {
1666ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        cache->exceptionWasRaisedExpectsHasHandlerFlag = NO;
1667ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        cache->exceptionWasRaisedFunc = getMethod(delegate, @selector(webView:exceptionWasRaised:sourceId:line:forWebFrame:));
1668ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
1669563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1670563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1671231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block- (void)_cacheHistoryDelegateImplementations
1672231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1673231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    WebHistoryDelegateImplementationCache *cache = &_private->historyDelegateImplementations;
1674231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    id delegate = _private->historyDelegate;
1675231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1676231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!delegate) {
1677231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        bzero(cache, sizeof(WebHistoryDelegateImplementationCache));
1678231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
1679231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
1680231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1681231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    cache->navigatedFunc = getMethod(delegate, @selector(webView:didNavigateWithNavigationData:inFrame:));
1682231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    cache->clientRedirectFunc = getMethod(delegate, @selector(webView:didPerformClientRedirectFromURL:toURL:inFrame:));
1683231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    cache->serverRedirectFunc = getMethod(delegate, @selector(webView:didPerformServerRedirectFromURL:toURL:inFrame:));
1684231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    cache->setTitleFunc = getMethod(delegate, @selector(webView:updateHistoryTitle:forURL:));
1685cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    cache->populateVisitedLinksFunc = getMethod(delegate, @selector(populateVisitedLinksForWebView:));
1686231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1687231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_policyDelegateForwarder
16898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->policyDelegateForwarder)
16918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->policyDelegateForwarder = [[_WebSafeForwarder alloc] initWithTarget:_private->policyDelegate defaultTarget:[WebDefaultPolicyDelegate sharedPolicyDelegate] catchExceptions:_private->catchesDelegateExceptions];
16928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->policyDelegateForwarder;
16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
16948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_UIDelegateForwarder
16968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
16978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->UIDelegateForwarder)
16988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->UIDelegateForwarder = [[_WebSafeForwarder alloc] initWithTarget:_private->UIDelegate defaultTarget:[WebDefaultUIDelegate sharedUIDelegate] catchExceptions:_private->catchesDelegateExceptions];
16998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->UIDelegateForwarder;
17008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_editingDelegateForwarder
17038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This can be called during window deallocation by QTMovieView in the QuickTime Cocoa Plug-in.
17058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Not sure if that is a bug or not.
17068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private)
17078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
17088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->editingDelegateForwarder)
17108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->editingDelegateForwarder = [[_WebSafeForwarder alloc] initWithTarget:_private->editingDelegate defaultTarget:[WebDefaultEditingDelegate sharedEditingDelegate] catchExceptions:_private->catchesDelegateExceptions];
17118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->editingDelegateForwarder;
17128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_closeWindow
17158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self _UIDelegateForwarder] webViewClose:self];
17178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1719563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark+ (void)_unregisterViewClassAndRepresentationClassForMIMEType:(NSString *)MIMEType
17208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[WebFrameView _viewTypesAllowImageTypeOmission:NO] removeObjectForKey:MIMEType];
17228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[WebDataSource _repTypesAllowImageTypeOmission:NO] removeObjectForKey:MIMEType];
17238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: We also need to maintain MIMEType registrations (which can be dynamically changed)
17258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // in the WebCore MIMEType registry.  For now we're doing this in a safe, limited manner
17268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // to fix <rdar://problem/5372989> - a future revamping of the entire system is neccesary for future robustness
17278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    MIMETypeRegistry::getSupportedNonImageMIMETypes().remove(MIMEType);
17288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1730563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark+ (void)_registerViewClass:(Class)viewClass representationClass:(Class)representationClass forURLScheme:(NSString *)URLScheme
17318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *MIMEType = [self _generatedMIMETypeForURLScheme:URLScheme];
17338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self registerViewClass:viewClass representationClass:representationClass forMIMEType:MIMEType];
17348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: We also need to maintain MIMEType registrations (which can be dynamically changed)
17368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // in the WebCore MIMEType registry.  For now we're doing this in a safe, limited manner
17378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // to fix <rdar://problem/5372989> - a future revamping of the entire system is neccesary for future robustness
17388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([viewClass class] == [WebHTMLView class])
17398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        MIMETypeRegistry::getSupportedNonImageMIMETypes().add(MIMEType);
17408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This is used to make _representationExistsForURLScheme faster.
17428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Without this set, we'd have to create the MIME type each time.
17438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (schemesWithRepresentationsSet == nil) {
17448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        schemesWithRepresentationsSet = [[NSMutableSet alloc] init];
17458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
17468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [schemesWithRepresentationsSet addObject:[[[URLScheme lowercaseString] copy] autorelease]];
17478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSString *)_generatedMIMETypeForURLScheme:(NSString *)URLScheme
17508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [@"x-apple-web-kit/" stringByAppendingString:[URLScheme lowercaseString]];
17528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (BOOL)_representationExistsForURLScheme:(NSString *)URLScheme
17558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [schemesWithRepresentationsSet containsObject:[URLScheme lowercaseString]];
17578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (BOOL)_canHandleRequest:(NSURLRequest *)request forMainFrame:(BOOL)forMainFrame
17608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: If <rdar://problem/5217309> gets fixed, this check can be removed.
17628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!request)
17638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
17648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([NSURLConnection canHandleRequest:request])
17668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return YES;
17678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *scheme = [[request URL] scheme];
17698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Representations for URL schemes work at the top level.
17718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (forMainFrame && [self _representationExistsForURLScheme:scheme])
17728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return YES;
17738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [scheme _webkit_isCaseInsensitiveEqualToString:@"applewebdata"];
17758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (BOOL)_canHandleRequest:(NSURLRequest *)request
17788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _canHandleRequest:request forMainFrame:YES];
17808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSString *)_decodeData:(NSData *)data
17838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HTMLNames::init(); // this method is used for importing bookmarks at startup, so HTMLNames are likely to be uninitialized yet
17858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<TextResourceDecoder> decoder = TextResourceDecoder::create("text/html"); // bookmark files are HTML
17868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String result = decoder->decode(static_cast<const char*>([data bytes]), [data length]);
17878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    result += decoder->flush();
17888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
17898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_pushPerformingProgrammaticFocus
17928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->programmaticFocusCount++;
17948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
17958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_popPerformingProgrammaticFocus
17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
17988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->programmaticFocusCount--;
17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_isPerformingProgrammaticFocus
18028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->programmaticFocusCount != 0;
18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_didChangeValueForKey: (NSString *)key
18078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
18088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG (Bindings, "calling didChangeValueForKey: %@", key);
18098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self didChangeValueForKey: key];
18108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_willChangeValueForKey: (NSString *)key
18138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
18148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG (Bindings, "calling willChangeValueForKey: %@", key);
18158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self willChangeValueForKey: key];
18168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
18198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static NSSet *manualNotifyKeys = nil;
18208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!manualNotifyKeys)
18218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        manualNotifyKeys = [[NSSet alloc] initWithObjects:_WebMainFrameURLKey, _WebIsLoadingKey, _WebEstimatedProgressKey,
1822563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            _WebCanGoBackKey, _WebCanGoForwardKey, _WebMainFrameTitleKey, _WebMainFrameIconKey, _WebMainFrameDocumentKey,
1823563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            nil];
18248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([manualNotifyKeys containsObject:key])
18258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
18268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return YES;
18278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)_declaredKeys {
18308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static NSArray *declaredKeys = nil;
18318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!declaredKeys)
18328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        declaredKeys = [[NSArray alloc] initWithObjects:_WebMainFrameURLKey, _WebIsLoadingKey, _WebEstimatedProgressKey,
18338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _WebCanGoBackKey, _WebCanGoForwardKey, _WebMainFrameTitleKey, _WebMainFrameIconKey, _WebMainFrameDocumentKey, nil];
18348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return declaredKeys;
18358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setObservationInfo:(void *)info
18388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
18398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->observationInfo = info;
18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void *)observationInfo
18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->observationInfo;
18458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_willChangeBackForwardKeys
18488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
18498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _willChangeValueForKey: _WebCanGoBackKey];
18508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _willChangeValueForKey: _WebCanGoForwardKey];
18518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_didChangeBackForwardKeys
18548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
18558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _didChangeValueForKey: _WebCanGoBackKey];
18568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _didChangeValueForKey: _WebCanGoForwardKey];
18578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_didStartProvisionalLoadForFrame:(WebFrame *)frame
18608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
18618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _willChangeBackForwardKeys];
18628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (frame == [self mainFrame]){
18638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Force an observer update by sending a will/did.
18648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _willChangeValueForKey: _WebIsLoadingKey];
18658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _didChangeValueForKey: _WebIsLoadingKey];
18668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _willChangeValueForKey: _WebMainFrameURLKey];
18688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [NSApp setWindowsNeedUpdate:YES];
18718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_didCommitLoadForFrame:(WebFrame *)frame
18748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
18758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (frame == [self mainFrame])
18768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _didChangeValueForKey: _WebMainFrameURLKey];
18778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [NSApp setWindowsNeedUpdate:YES];
18788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_didFinishLoadForFrame:(WebFrame *)frame
18818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
18828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _didChangeBackForwardKeys];
18838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (frame == [self mainFrame]){
18848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Force an observer update by sending a will/did.
18858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _willChangeValueForKey: _WebIsLoadingKey];
18868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _didChangeValueForKey: _WebIsLoadingKey];
18878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [NSApp setWindowsNeedUpdate:YES];
18898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
18908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_didFailLoadWithError:(NSError *)error forFrame:(WebFrame *)frame
18928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
18938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _didChangeBackForwardKeys];
18948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (frame == [self mainFrame]){
18958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Force an observer update by sending a will/did.
18968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _willChangeValueForKey: _WebIsLoadingKey];
18978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _didChangeValueForKey: _WebIsLoadingKey];
18988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
18998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [NSApp setWindowsNeedUpdate:YES];
19008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_didFailProvisionalLoadWithError:(NSError *)error forFrame:(WebFrame *)frame
19038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _didChangeBackForwardKeys];
19058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (frame == [self mainFrame]){
19068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Force an observer update by sending a will/did.
19078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _willChangeValueForKey: _WebIsLoadingKey];
19088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _didChangeValueForKey: _WebIsLoadingKey];
19098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _didChangeValueForKey: _WebMainFrameURLKey];
19118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
19128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [NSApp setWindowsNeedUpdate:YES];
19138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSCachedURLResponse *)_cachedResponseForURL:(NSURL *)URL
19168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:URL];
19188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [request _web_setHTTPUserAgent:[self userAgentForURL:URL]];
191981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    NSCachedURLResponse *cachedResponse;
192081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CFURLSTORAGESESSIONS)
192181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (CFURLStorageSessionRef storageSession = ResourceHandle::privateBrowsingStorageSession())
192281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        cachedResponse = WKCachedResponseForRequest(storageSession, request);
192381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    else
192481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
192581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
19268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [request release];
19278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return cachedResponse;
19288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_writeImageForElement:(NSDictionary *)element withPasteboardTypes:(NSArray *)types toPasteboard:(NSPasteboard *)pasteboard
19318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSURL *linkURL = [element objectForKey:WebElementLinkURLKey];
19338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DOMElement *domElement = [element objectForKey:WebElementDOMNodeKey];
19348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [pasteboard _web_writeImage:(NSImage *)(domElement ? nil : [element objectForKey:WebElementImageKey])
19358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        element:domElement
19368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            URL:linkURL ? linkURL : (NSURL *)[element objectForKey:WebElementImageURLKey]
19378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                          title:[element objectForKey:WebElementImageAltStringKey]
19388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        archive:[[element objectForKey:WebElementDOMNodeKey] webArchive]
19398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                          types:types
19408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                         source:nil];
19418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_writeLinkElement:(NSDictionary *)element withPasteboardTypes:(NSArray *)types toPasteboard:(NSPasteboard *)pasteboard
19448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [pasteboard _web_writeURL:[element objectForKey:WebElementLinkURLKey]
19468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                     andTitle:[element objectForKey:WebElementLinkLabelKey]
19478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        types:types];
19488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setInitiatedDrag:(BOOL)initiatedDrag
19518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
19528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
19538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
19548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->page->dragController()->setDidInitiateDrag(initiatedDrag);
19558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
19568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
19588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define DASHBOARD_CONTROL_LABEL @"control"
19608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_addControlRect:(NSRect)bounds clip:(NSRect)clip fromView:(NSView *)view toDashboardRegions:(NSMutableDictionary *)regions
19620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
19630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSRect adjustedBounds = bounds;
19640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    adjustedBounds.origin = [self convertPoint:bounds.origin fromView:view];
19650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    adjustedBounds.origin.y = [self bounds].size.height - adjustedBounds.origin.y;
19660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    adjustedBounds.size = bounds.size;
19670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
19680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSRect adjustedClip;
19690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    adjustedClip.origin = [self convertPoint:clip.origin fromView:view];
19700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    adjustedClip.origin.y = [self bounds].size.height - adjustedClip.origin.y;
19710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    adjustedClip.size = clip.size;
19720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
19730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebDashboardRegion *region = [[WebDashboardRegion alloc] initWithRect:adjustedBounds
19740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        clip:adjustedClip type:WebDashboardRegionTypeScrollerRectangle];
19750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSMutableArray *scrollerRegions = [regions objectForKey:DASHBOARD_CONTROL_LABEL];
19760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!scrollerRegions) {
19770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        scrollerRegions = [[NSMutableArray alloc] init];
19780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [regions setObject:scrollerRegions forKey:DASHBOARD_CONTROL_LABEL];
19790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [scrollerRegions release];
19800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
19810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [scrollerRegions addObject:region];
19820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [region release];
19830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
19840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
19850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_addScrollerDashboardRegionsForFrameView:(FrameView*)frameView dashboardRegions:(NSMutableDictionary *)regions
19860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
19870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSView *documentView = [[kit(frameView->frame()) frameView] documentView];
19880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
19890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    const HashSet<RefPtr<Widget> >* children = frameView->children();
19900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HashSet<RefPtr<Widget> >::const_iterator end = children->end();
19910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (HashSet<RefPtr<Widget> >::const_iterator it = children->begin(); it != end; ++it) {
19920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Widget* widget = (*it).get();
19930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (widget->isFrameView()) {
19940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [self _addScrollerDashboardRegionsForFrameView:static_cast<FrameView*>(widget) dashboardRegions:regions];
19950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            continue;
19960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
19970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
19980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!widget->isScrollbar())
19990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            continue;
20000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
20010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // FIXME: This should really pass an appropriate clip, but our first try got it wrong, and
20020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // it's not common to need this to be correct in Dashboard widgets.
20030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        NSRect bounds = widget->frameRect();
20040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [self _addControlRect:bounds clip:bounds fromView:documentView toDashboardRegions:regions];
20050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
20060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
20070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
20088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_addScrollerDashboardRegions:(NSMutableDictionary *)regions from:(NSArray *)views
20098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Add scroller regions for NSScroller and WebCore scrollbars
20110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSUInteger count = [views count];
20120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (NSUInteger i = 0; i < count; i++) {
20130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        NSView *view = [views objectAtIndex:i];
20148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ([view isKindOfClass:[WebHTMLView class]]) {
20160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (Frame* coreFrame = core([(WebHTMLView*)view _frame])) {
20170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                if (FrameView* coreView = coreFrame->view())
20180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    [self _addScrollerDashboardRegionsForFrameView:coreView dashboardRegions:regions];
20198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
20200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        } else if ([view isKindOfClass:[NSScroller class]]) {
20210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // AppKit places absent scrollers at -100,-100
20220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if ([view frame].origin.y < 0)
20230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                continue;
20240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [self _addControlRect:[view bounds] clip:[view visibleRect] fromView:view toDashboardRegions:regions];
20258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [self _addScrollerDashboardRegions:regions from:[view subviews]];
20278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
20288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_addScrollerDashboardRegions:(NSMutableDictionary *)regions
20318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _addScrollerDashboardRegions:regions from:[self subviews]];
20338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSDictionary *)_dashboardRegions
20368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only return regions from main frame.
20380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* mainFrame = [self _mainCoreFrame];
20398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!mainFrame)
20408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
204168513a70bcd92384395513322f1b801e7bf9c729Steve Block
204268513a70bcd92384395513322f1b801e7bf9c729Steve Block    const Vector<DashboardRegionValue>& regions = mainFrame->document()->dashboardRegions();
204368513a70bcd92384395513322f1b801e7bf9c729Steve Block    size_t size = regions.size();
204468513a70bcd92384395513322f1b801e7bf9c729Steve Block
204568513a70bcd92384395513322f1b801e7bf9c729Steve Block    NSMutableDictionary *webRegions = [NSMutableDictionary dictionaryWithCapacity:size];
204668513a70bcd92384395513322f1b801e7bf9c729Steve Block    for (size_t i = 0; i < size; i++) {
204768513a70bcd92384395513322f1b801e7bf9c729Steve Block        const DashboardRegionValue& region = regions[i];
204868513a70bcd92384395513322f1b801e7bf9c729Steve Block
204968513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (region.type == StyleDashboardRegion::None)
205068513a70bcd92384395513322f1b801e7bf9c729Steve Block            continue;
205168513a70bcd92384395513322f1b801e7bf9c729Steve Block
205268513a70bcd92384395513322f1b801e7bf9c729Steve Block        NSString *label = region.label;
205368513a70bcd92384395513322f1b801e7bf9c729Steve Block        WebDashboardRegionType type = WebDashboardRegionTypeNone;
205468513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (region.type == StyleDashboardRegion::Circle)
205568513a70bcd92384395513322f1b801e7bf9c729Steve Block            type = WebDashboardRegionTypeCircle;
205668513a70bcd92384395513322f1b801e7bf9c729Steve Block        else if (region.type == StyleDashboardRegion::Rectangle)
205768513a70bcd92384395513322f1b801e7bf9c729Steve Block            type = WebDashboardRegionTypeRectangle;
205868513a70bcd92384395513322f1b801e7bf9c729Steve Block        NSMutableArray *regionValues = [webRegions objectForKey:label];
205968513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (!regionValues) {
206068513a70bcd92384395513322f1b801e7bf9c729Steve Block            regionValues = [[NSMutableArray alloc] initWithCapacity:1];
206168513a70bcd92384395513322f1b801e7bf9c729Steve Block            [webRegions setObject:regionValues forKey:label];
206268513a70bcd92384395513322f1b801e7bf9c729Steve Block            [regionValues release];
206368513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
206468513a70bcd92384395513322f1b801e7bf9c729Steve Block
206568513a70bcd92384395513322f1b801e7bf9c729Steve Block        WebDashboardRegion *webRegion = [[WebDashboardRegion alloc] initWithRect:region.bounds clip:region.clip type:type];
206668513a70bcd92384395513322f1b801e7bf9c729Steve Block        [regionValues addObject:webRegion];
206768513a70bcd92384395513322f1b801e7bf9c729Steve Block        [webRegion release];
206868513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
206968513a70bcd92384395513322f1b801e7bf9c729Steve Block
207068513a70bcd92384395513322f1b801e7bf9c729Steve Block    [self _addScrollerDashboardRegions:webRegions];
207168513a70bcd92384395513322f1b801e7bf9c729Steve Block
207268513a70bcd92384395513322f1b801e7bf9c729Steve Block    return webRegions;
20738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
20748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setDashboardBehavior:(WebDashboardBehavior)behavior to:(BOOL)flag
20768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
20778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Remove this blanket assignment once Dashboard and Dashcode implement
20788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // specific support for the backward compatibility mode flag.
20798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (behavior == WebDashboardBehaviorAllowWheelScrolling && flag == NO && _private->page)
20808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->page->settings()->setUsesDashboardBackwardCompatibilityMode(true);
20818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (behavior) {
20838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebDashboardBehaviorAlwaysSendMouseEventsToAllWindows: {
20848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->dashboardBehaviorAlwaysSendMouseEventsToAllWindows = flag;
20858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
20868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebDashboardBehaviorAlwaysSendActiveNullEventsToPlugIns: {
20888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->dashboardBehaviorAlwaysSendActiveNullEventsToPlugIns = flag;
20898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
20908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebDashboardBehaviorAlwaysAcceptsFirstMouse: {
20928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->dashboardBehaviorAlwaysAcceptsFirstMouse = flag;
20938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
20948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebDashboardBehaviorAllowWheelScrolling: {
20968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->dashboardBehaviorAllowWheelScrolling = flag;
20978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
20988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebDashboardBehaviorUseBackwardCompatibilityMode: {
21008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (_private->page)
21018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                _private->page->settings()->setUsesDashboardBackwardCompatibilityMode(flag);
21028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
21038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
21048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2105bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
2106bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // Pre-HTML5 parser quirks should be enabled if Dashboard is in backward
2107bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // compatibility mode. See <rdar://problem/8175982>.
2108bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (_private->page)
2109bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        _private->page->settings()->setUsePreHTML5ParserQuirks([self _needsPreHTML5ParserQuirks]);
21108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_dashboardBehavior:(WebDashboardBehavior)behavior
21138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (behavior) {
21158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebDashboardBehaviorAlwaysSendMouseEventsToAllWindows: {
21168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return _private->dashboardBehaviorAlwaysSendMouseEventsToAllWindows;
21178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
21188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebDashboardBehaviorAlwaysSendActiveNullEventsToPlugIns: {
21198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return _private->dashboardBehaviorAlwaysSendActiveNullEventsToPlugIns;
21208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
21218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebDashboardBehaviorAlwaysAcceptsFirstMouse: {
21228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return _private->dashboardBehaviorAlwaysAcceptsFirstMouse;
21238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
21248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebDashboardBehaviorAllowWheelScrolling: {
21258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return _private->dashboardBehaviorAllowWheelScrolling;
21268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
21278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WebDashboardBehaviorUseBackwardCompatibilityMode: {
21288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return _private->page && _private->page->settings()->usesDashboardBackwardCompatibilityMode();
21298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
21308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NO;
21328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif /* ENABLE(DASHBOARD_SUPPORT) */
21358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)_setShouldUseFontSmoothing:(BOOL)f
21378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Font::setShouldUseSmoothing(f);
21398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (BOOL)_shouldUseFontSmoothing
21428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return Font::shouldUseSmoothing();
21448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)_setUsesTestModeFocusRingColor:(BOOL)f
21478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setUsesTestModeFocusRingColor(f);
21498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (BOOL)_usesTestModeFocusRingColor
21528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return usesTestModeFocusRingColor();
21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setAlwaysShowVerticalScroller:(BOOL)flag
21578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebDynamicScrollBarsView *scrollview = [[[self mainFrame] frameView] _scrollView];
21598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (flag) {
21608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [scrollview setVerticalScrollingMode:ScrollbarAlwaysOn andLock:YES];
21618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
21628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [scrollview setVerticalScrollingModeLocked:NO];
21638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [scrollview setVerticalScrollingMode:ScrollbarAuto andLock:NO];
21648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)alwaysShowVerticalScroller
21688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebDynamicScrollBarsView *scrollview = [[[self mainFrame] frameView] _scrollView];
21708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [scrollview verticalScrollingModeLocked] && [scrollview verticalScrollingMode] == ScrollbarAlwaysOn;
21718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setAlwaysShowHorizontalScroller:(BOOL)flag
21748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebDynamicScrollBarsView *scrollview = [[[self mainFrame] frameView] _scrollView];
21768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (flag) {
21778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [scrollview setHorizontalScrollingMode:ScrollbarAlwaysOn andLock:YES];
21788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
21798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [scrollview setHorizontalScrollingModeLocked:NO];
21808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [scrollview setHorizontalScrollingMode:ScrollbarAuto andLock:NO];
21818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setProhibitsMainFrameScrolling:(BOOL)prohibits
21858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (Frame* mainFrame = [self _mainCoreFrame])
21878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        mainFrame->view()->setProhibitsScrolling(prohibits);
21888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)alwaysShowHorizontalScroller
21918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebDynamicScrollBarsView *scrollview = [[[self mainFrame] frameView] _scrollView];
21938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [scrollview horizontalScrollingModeLocked] && [scrollview horizontalScrollingMode] == ScrollbarAlwaysOn;
21948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
21958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setInViewSourceMode:(BOOL)flag
21978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
21980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (Frame* mainFrame = [self _mainCoreFrame])
21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        mainFrame->setInViewSourceMode(flag);
22008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_inViewSourceMode
22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* mainFrame = [self _mainCoreFrame];
22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return mainFrame && mainFrame->inViewSourceMode();
22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setUseFastImageScalingMode:(BOOL)flag
22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->page && _private->page->inLowQualityImageInterpolationMode() != flag) {
22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->page->setInLowQualityImageInterpolationMode(flag);
22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self setNeedsDisplay:YES];
22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
22148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_inFastImageScalingMode
22178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->page)
22198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return _private->page->inLowQualityImageInterpolationMode();
22208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NO;
22218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_cookieEnabled
22248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->page)
22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return _private->page->cookieEnabled();
22278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return YES;
22288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setCookieEnabled:(BOOL)enable
22318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->page)
22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->page->setCookieEnabled(enable);
22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setAdditionalWebPlugInPaths:(NSArray *)newPaths
22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->pluginDatabase)
22398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->pluginDatabase = [[WebPluginDatabase alloc] init];
22408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private->pluginDatabase setPlugInPaths:newPaths];
22428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private->pluginDatabase refresh];
22438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_attachScriptDebuggerToAllFrames
22468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (Frame* frame = [self _mainCoreFrame]; frame; frame = frame->tree()->traverseNext())
22488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [kit(frame) _attachScriptDebugger];
22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_detachScriptDebuggerFromAllFrames
22528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    for (Frame* frame = [self _mainCoreFrame]; frame; frame = frame->tree()->traverseNext())
22548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [kit(frame) _detachScriptDebugger];
22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setBackgroundColor:(NSColor *)backgroundColor
22588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([_private->backgroundColor isEqual:backgroundColor])
22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
22618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id old = _private->backgroundColor;
22638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->backgroundColor = [backgroundColor retain];
22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [old release];
22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self mainFrame] _updateBackgroundAndUpdatesWhileOffscreen];
22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSColor *)backgroundColor
22708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->backgroundColor;
22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)defersCallbacks
22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->page->defersLoading();
22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setDefersCallbacks:(BOOL)defer
22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->page->setDefersLoading(defer);
22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// For backwards compatibility with the WebBackForwardList API, we honor both
22898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// a per-WebView and a per-preferences setting for whether to use the page cache.
22908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)usesPageCache
22928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->usesPageCache && [[self preferences] usesPageCache];
22948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
22958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setUsesPageCache:(BOOL)usesPageCache
22978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
22988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->usesPageCache = usesPageCache;
22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Update our own settings and post the public notification only
23012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    [self _preferencesChanged:[self preferences]];
23022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    [[self preferences] _postPreferencesChangedAPINotification];
23038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (WebHistoryItem *)_globalHistoryItem
2306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
230781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!_private)
2308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return nil;
230981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
231081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return kit(_private->_globalHistoryItem.get());
231181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
231281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
231381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch- (void)_setGlobalHistoryItem:(HistoryItem*)historyItem
231481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
231581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    _private->_globalHistoryItem = historyItem;
2316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
2317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebTextIterator *)textIteratorForRect:(NSRect)rect
23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint rectStart(rect.origin.x, rect.origin.y);
23218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint rectEnd(rect.origin.x + rect.size.width, rect.origin.y + rect.size.height);
23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* coreFrame = [self _mainCoreFrame];
23248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!coreFrame)
23258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
23268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2327563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    VisibleSelection selectionInsideRect(coreFrame->visiblePositionForPoint(rectStart), coreFrame->visiblePositionForPoint(rectEnd));
23288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return [[[WebTextIterator alloc] initWithRange:kit(selectionInsideRect.toNormalizedRange().get())] autorelease];
23308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)handleAuthenticationForResource:(id)identifier challenge:(NSURLAuthenticationChallenge *)challenge fromDataSource:(WebDataSource *)dataSource
23338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSWindow *window = [self hostWindow] ? [self hostWindow] : [self window];
23358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[WebPanelAuthenticationHandler sharedHandler] startAuthentication:challenge window:window];
23368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_clearUndoRedoOperations
23398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
23418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
23428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->page->clearUndoRedoOperations();
23438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setCatchesDelegateExceptions:(BOOL)f
23468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->catchesDelegateExceptions = f;
23488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_catchesDelegateExceptions
23518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->catchesDelegateExceptions;
23538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_executeCoreCommandByName:(NSString *)name value:(NSString *)value
23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* coreFrame = [self _mainCoreFrame];
23588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!coreFrame)
23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    coreFrame->editor()->command(name).execute(value);
23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setCustomHTMLTokenizerTimeDelay:(double)timeDelay
23648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->page->setCustomHTMLTokenizerTimeDelay(timeDelay);
23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setCustomHTMLTokenizerChunkSize:(int)chunkSize
23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
23748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->page->setCustomHTMLTokenizerChunkSize(chunkSize);
23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_clearMainFrameName
23788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
23798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->page->mainFrame()->tree()->clearName();
23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
23818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2382635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)setSelectTrailingWhitespaceEnabled:(BOOL)flag
2383635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
2384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    _private->selectTrailingWhitespaceEnabled = flag;
2385635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (flag)
2386635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        [self setSmartInsertDeleteEnabled:false];
2387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
2388635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (BOOL)isSelectTrailingWhitespaceEnabled
2390635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
2391635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return _private->selectTrailingWhitespaceEnabled;
2392635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
2393635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)setMemoryCacheDelegateCallsEnabled:(BOOL)enabled
2395635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
2396635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    _private->page->setMemoryCacheClientCallsEnabled(enabled);
2397635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
2398635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2399635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (BOOL)areMemoryCacheDelegateCallsEnabled
2400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
2401635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return _private->page->areMemoryCacheClientCallsEnabled();
2402635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
2403635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2404563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)_setJavaScriptURLsAreAllowed:(BOOL)areAllowed
2405563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
2406563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    _private->page->setJavaScriptURLsAreAllowed(areAllowed);
2407563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
2408563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
2409563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark+ (NSCursor *)_pointingHandCursor
2410563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
2411967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return handCursor().platformCursor();
2412563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
2413563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
2414643ca7872b450ea4efacab6188849e5aac2ba161Steve Block- (BOOL)_postsAcceleratedCompositingNotifications
2415643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2416643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(ACCELERATED_COMPOSITING)
2417643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return _private->postsAcceleratedCompositingNotifications;
2418643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else
2419643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return NO;
2420643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
2421643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2422643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2423643ca7872b450ea4efacab6188849e5aac2ba161Steve Block- (void)_setPostsAcceleratedCompositingNotifications:(BOOL)flag
2424643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2425643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(ACCELERATED_COMPOSITING)
2426643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    _private->postsAcceleratedCompositingNotifications = flag;
2427643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
2428643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2429643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
24300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)_isUsingAcceleratedCompositing
2431563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
24320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
2433643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (_private->usesDocumentViews) {
2434692e5dbf12901edacf14812a6fae25462920af42Steve Block        Frame* coreFrame = [self _mainCoreFrame];
2435643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        for (Frame* frame = coreFrame; frame; frame = frame->tree()->traverseNext(coreFrame)) {
2436643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            NSView *documentView = [[kit(frame) frameView] documentView];
2437643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if ([documentView isKindOfClass:[WebHTMLView class]] && [(WebHTMLView *)documentView _isUsingAcceleratedCompositing])
2438643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                return YES;
2439643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
2440643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
2441692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
24420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NO;
2443692e5dbf12901edacf14812a6fae25462920af42Steve Block}
2444692e5dbf12901edacf14812a6fae25462920af42Steve Block
24452bde8e466a4451c7319e3a072d118917957d6554Steve Block- (BOOL)interactiveFormValidationEnabled
24462bde8e466a4451c7319e3a072d118917957d6554Steve Block{
24472bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _private->interactiveFormValidationEnabled;
24482bde8e466a4451c7319e3a072d118917957d6554Steve Block}
24492bde8e466a4451c7319e3a072d118917957d6554Steve Block
24502bde8e466a4451c7319e3a072d118917957d6554Steve Block- (void)setInteractiveFormValidationEnabled:(BOOL)enabled
24512bde8e466a4451c7319e3a072d118917957d6554Steve Block{
24522bde8e466a4451c7319e3a072d118917957d6554Steve Block    _private->interactiveFormValidationEnabled = enabled;
24532bde8e466a4451c7319e3a072d118917957d6554Steve Block}
24542bde8e466a4451c7319e3a072d118917957d6554Steve Block
24552bde8e466a4451c7319e3a072d118917957d6554Steve Block- (int)validationMessageTimerMagnification
24562bde8e466a4451c7319e3a072d118917957d6554Steve Block{
24572bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _private->validationMessageTimerMagnification;
24582bde8e466a4451c7319e3a072d118917957d6554Steve Block}
24592bde8e466a4451c7319e3a072d118917957d6554Steve Block
24602bde8e466a4451c7319e3a072d118917957d6554Steve Block- (void)setValidationMessageTimerMagnification:(int)newValue
24612bde8e466a4451c7319e3a072d118917957d6554Steve Block{
24622bde8e466a4451c7319e3a072d118917957d6554Steve Block    _private->validationMessageTimerMagnification = newValue;
24632bde8e466a4451c7319e3a072d118917957d6554Steve Block}
24642bde8e466a4451c7319e3a072d118917957d6554Steve Block
2465692e5dbf12901edacf14812a6fae25462920af42Steve Block- (BOOL)_isSoftwareRenderable
2466692e5dbf12901edacf14812a6fae25462920af42Steve Block{
2467692e5dbf12901edacf14812a6fae25462920af42Steve Block#if USE(ACCELERATED_COMPOSITING)
2468692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (_private->usesDocumentViews) {
2469692e5dbf12901edacf14812a6fae25462920af42Steve Block        Frame* coreFrame = [self _mainCoreFrame];
2470692e5dbf12901edacf14812a6fae25462920af42Steve Block        for (Frame* frame = coreFrame; frame; frame = frame->tree()->traverseNext(coreFrame)) {
2471692e5dbf12901edacf14812a6fae25462920af42Steve Block            if (FrameView* view = frame->view()) {
2472692e5dbf12901edacf14812a6fae25462920af42Steve Block                if (!view->isSoftwareRenderable())
2473692e5dbf12901edacf14812a6fae25462920af42Steve Block                    return NO;
2474692e5dbf12901edacf14812a6fae25462920af42Steve Block            }
2475692e5dbf12901edacf14812a6fae25462920af42Steve Block        }
2476692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
24770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
2478692e5dbf12901edacf14812a6fae25462920af42Steve Block    return YES;
2479692e5dbf12901edacf14812a6fae25462920af42Steve Block}
2480692e5dbf12901edacf14812a6fae25462920af42Steve Block
2481692e5dbf12901edacf14812a6fae25462920af42Steve Block- (void)_setIncludesFlattenedCompositingLayersWhenDrawingToBitmap:(BOOL)flag
2482692e5dbf12901edacf14812a6fae25462920af42Steve Block{
2483692e5dbf12901edacf14812a6fae25462920af42Steve Block    _private->includesFlattenedCompositingLayersWhenDrawingToBitmap = flag;
2484692e5dbf12901edacf14812a6fae25462920af42Steve Block}
2485692e5dbf12901edacf14812a6fae25462920af42Steve Block
2486692e5dbf12901edacf14812a6fae25462920af42Steve Block- (BOOL)_includesFlattenedCompositingLayersWhenDrawingToBitmap
2487692e5dbf12901edacf14812a6fae25462920af42Steve Block{
2488692e5dbf12901edacf14812a6fae25462920af42Steve Block    return _private->includesFlattenedCompositingLayersWhenDrawingToBitmap;
2489563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
2490563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
2491e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if ENABLE(NETSCAPE_PLUGIN_API)
2492cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockstatic WebBaseNetscapePluginView *_pluginViewForNode(DOMNode *node)
2493cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
2494cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!node)
2495cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return nil;
2496cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2497cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Node* coreNode = core(node);
2498cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!coreNode)
2499cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return nil;
2500cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2501cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    RenderObject* renderer = coreNode->renderer();
2502cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!renderer || !renderer->isWidget())
2503cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return nil;
2504cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2505cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Widget* widget = toRenderWidget(renderer)->widget();
2506cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!widget || !widget->platformWidget())
2507cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return nil;
2508cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2509cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    NSView *view = widget->platformWidget();
2510cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (![view isKindOfClass:[WebBaseNetscapePluginView class]])
2511cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return nil;
2512cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2513cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return (WebBaseNetscapePluginView *)view;
2514cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
2515e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif // ENABLE(NETSCAPE_PLUGIN_API)
2516cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2517cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block+ (BOOL)_isNodeHaltedPlugin:(DOMNode *)node
2518cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
2519e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if ENABLE(NETSCAPE_PLUGIN_API)
2520cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return [_pluginViewForNode(node) isHalted];
2521e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#else
2522e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return YES;
2523e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif
2524cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
2525cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2526cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block+ (BOOL)_hasPluginForNodeBeenHalted:(DOMNode *)node
2527cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
2528e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if ENABLE(NETSCAPE_PLUGIN_API)
2529cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return [_pluginViewForNode(node) hasBeenHalted];
2530e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#else
2531e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return YES;
2532e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif
2533cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
2534cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block+ (void)_restartHaltedPluginForNode:(DOMNode *)node
2535cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
2536e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if ENABLE(NETSCAPE_PLUGIN_API)
2537cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!node)
2538cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
2539cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2540cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    [_pluginViewForNode(node) resumeFromHalt];
2541e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif
2542cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
2543cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
25440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (NSPasteboard *)_insertionPasteboard
2545563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
25460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return _private ? _private->insertionPasteboard : nil;
2547563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
2548563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
2549dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block+ (void)_addOriginAccessWhitelistEntryWithSourceOrigin:(NSString *)sourceOrigin destinationProtocol:(NSString *)destinationProtocol destinationHost:(NSString *)destinationHost allowDestinationSubdomains:(BOOL)allowDestinationSubdomains
2550231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
2551dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    SecurityOrigin::addOriginAccessWhitelistEntry(*SecurityOrigin::createFromString(sourceOrigin), destinationProtocol, destinationHost, allowDestinationSubdomains);
2552231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
2553231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2554dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block+ (void)_removeOriginAccessWhitelistEntryWithSourceOrigin:(NSString *)sourceOrigin destinationProtocol:(NSString *)destinationProtocol destinationHost:(NSString *)destinationHost allowDestinationSubdomains:(BOOL)allowDestinationSubdomains
2555231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
2556dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    SecurityOrigin::removeOriginAccessWhitelistEntry(*SecurityOrigin::createFromString(sourceOrigin), destinationProtocol, destinationHost, allowDestinationSubdomains);
2557dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
2558dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2559dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block+(void)_resetOriginAccessWhitelists
2560dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
2561dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    SecurityOrigin::resetOriginAccessWhitelists();
2562231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
2563563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
25640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_updateActiveState
2565563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
25660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private && _private->page)
25670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        _private->page->focusController()->setActive([[self window] isKeyWindow]);
2568563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
2569563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
2570231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic PassOwnPtr<Vector<String> > toStringVector(NSArray* patterns)
2571231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
2572231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Convert the patterns into Vectors.
2573231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    NSUInteger count = [patterns count];
2574231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (count == 0)
2575231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return 0;
2576231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Vector<String>* patternsVector = new Vector<String>;
2577231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    for (NSUInteger i = 0; i < count; ++i) {
2578231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        id entry = [patterns objectAtIndex:i];
2579231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if ([entry isKindOfClass:[NSString class]])
2580231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            patternsVector->append(String((NSString*)entry));
2581231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
2582231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return patternsVector;
2583231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
2584231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2585643ca7872b450ea4efacab6188849e5aac2ba161Steve Block+ (void)_addUserScriptToGroup:(NSString *)groupName world:(WebScriptWorld *)world source:(NSString *)source url:(NSURL *)url
2586e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                    whitelist:(NSArray *)whitelist blacklist:(NSArray *)blacklist
2587e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                injectionTime:(WebUserScriptInjectionTime)injectionTime
2588e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
2589e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    [WebView _addUserScriptToGroup:groupName world:world source:source url:url whitelist:whitelist blacklist:blacklist injectionTime:injectionTime injectedFrames:WebInjectInAllFrames];
2590e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
2591e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
2592e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke+ (void)_addUserScriptToGroup:(NSString *)groupName world:(WebScriptWorld *)world source:(NSString *)source url:(NSURL *)url
2593e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                    whitelist:(NSArray *)whitelist blacklist:(NSArray *)blacklist
2594e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                injectionTime:(WebUserScriptInjectionTime)injectionTime
2595e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke               injectedFrames:(WebUserContentInjectedFrames)injectedFrames
2596231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
2597231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    String group(groupName);
2598643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (group.isEmpty())
2599231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2600231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2601231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    PageGroup* pageGroup = PageGroup::pageGroup(group);
2602231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!pageGroup)
2603231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2604231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2605643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    pageGroup->addUserScriptToWorld(core(world), source, url, toStringVector(whitelist), toStringVector(blacklist),
2606e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                                    injectionTime == WebInjectAtDocumentStart ? InjectAtDocumentStart : InjectAtDocumentEnd,
2607e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                                    injectedFrames == WebInjectInAllFrames ? InjectInAllFrames : InjectInTopFrameOnly);
2608e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
2609e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
2610e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke+ (void)_addUserStyleSheetToGroup:(NSString *)groupName world:(WebScriptWorld *)world source:(NSString *)source url:(NSURL *)url
2611e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                        whitelist:(NSArray *)whitelist blacklist:(NSArray *)blacklist
2612e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
2613e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    [WebView _addUserStyleSheetToGroup:groupName world:world source:source url:url whitelist:whitelist blacklist:blacklist injectedFrames:WebInjectInAllFrames];
2614231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
2615231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2616643ca7872b450ea4efacab6188849e5aac2ba161Steve Block+ (void)_addUserStyleSheetToGroup:(NSString *)groupName world:(WebScriptWorld *)world source:(NSString *)source url:(NSURL *)url
2617231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                        whitelist:(NSArray *)whitelist blacklist:(NSArray *)blacklist
2618e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                   injectedFrames:(WebUserContentInjectedFrames)injectedFrames
2619231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
2620231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    String group(groupName);
2621643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (group.isEmpty())
2622231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2623231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2624231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    PageGroup* pageGroup = PageGroup::pageGroup(group);
2625231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!pageGroup)
2626231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2627231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2628e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    pageGroup->addUserStyleSheetToWorld(core(world), source, url, toStringVector(whitelist), toStringVector(blacklist), injectedFrames == WebInjectInAllFrames ? InjectInAllFrames : InjectInTopFrameOnly);
2629cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
2630cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2631643ca7872b450ea4efacab6188849e5aac2ba161Steve Block+ (void)_removeUserScriptFromGroup:(NSString *)groupName world:(WebScriptWorld *)world url:(NSURL *)url
2632cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
2633cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    String group(groupName);
2634cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (group.isEmpty())
2635cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
2636cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2637cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    PageGroup* pageGroup = PageGroup::pageGroup(group);
2638cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!pageGroup)
2639cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
2640cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2641643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    pageGroup->removeUserScriptFromWorld(core(world), url);
2642231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
2643231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2644643ca7872b450ea4efacab6188849e5aac2ba161Steve Block+ (void)_removeUserStyleSheetFromGroup:(NSString *)groupName world:(WebScriptWorld *)world url:(NSURL *)url
2645231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
2646231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    String group(groupName);
2647231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (group.isEmpty())
2648231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2649231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2650231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    PageGroup* pageGroup = PageGroup::pageGroup(group);
2651231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!pageGroup)
2652231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2653231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2654643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    pageGroup->removeUserStyleSheetFromWorld(core(world), url);
2655231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
2656231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2657643ca7872b450ea4efacab6188849e5aac2ba161Steve Block+ (void)_removeUserScriptsFromGroup:(NSString *)groupName world:(WebScriptWorld *)world
2658231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
2659231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    String group(groupName);
2660231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (group.isEmpty())
2661231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2662231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2663231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    PageGroup* pageGroup = PageGroup::pageGroup(group);
2664231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!pageGroup)
2665231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2666231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2667643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    pageGroup->removeUserScriptsFromWorld(core(world));
2668cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
2669cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2670643ca7872b450ea4efacab6188849e5aac2ba161Steve Block+ (void)_removeUserStyleSheetsFromGroup:(NSString *)groupName world:(WebScriptWorld *)world
2671cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
2672cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    String group(groupName);
2673cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (group.isEmpty())
2674cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
2675cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2676cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    PageGroup* pageGroup = PageGroup::pageGroup(group);
2677cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!pageGroup)
2678cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
2679cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2680643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    pageGroup->removeUserStyleSheetsFromWorld(core(world));
2681231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
2682231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2683231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block+ (void)_removeAllUserContentFromGroup:(NSString *)groupName
2684231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
2685231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    String group(groupName);
2686231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (group.isEmpty())
2687231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2688231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2689231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    PageGroup* pageGroup = PageGroup::pageGroup(group);
2690231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!pageGroup)
2691231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2692231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2693231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    pageGroup->removeAllUserContent();
2694231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
2695231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2696231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block- (BOOL)cssAnimationsSuspended
2697231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
2698231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return _private->cssAnimationsSuspended;
2699231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
2700231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2701231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block- (void)setCSSAnimationsSuspended:(BOOL)suspended
2702231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
2703231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (suspended == _private->cssAnimationsSuspended)
2704231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
2705231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2706231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    _private->cssAnimationsSuspended = suspended;
2707231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2708231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Frame* frame = core([self mainFrame]);
2709231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (suspended)
271028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        frame->animation()->suspendAnimations();
2711231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else
271228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        frame->animation()->resumeAnimations();
2713231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
2714231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2715d0825bca7fe65beaee391d30da42e937db621564Steve Block+ (void)_setDomainRelaxationForbidden:(BOOL)forbidden forURLScheme:(NSString *)scheme
2716d0825bca7fe65beaee391d30da42e937db621564Steve Block{
2717d0825bca7fe65beaee391d30da42e937db621564Steve Block    SecurityOrigin::setDomainRelaxationForbiddenForURLScheme(forbidden, scheme);
2718d0825bca7fe65beaee391d30da42e937db621564Steve Block}
2719d0825bca7fe65beaee391d30da42e937db621564Steve Block
2720dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block+ (void)_registerURLSchemeAsSecure:(NSString *)scheme
2721dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
27220617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    SchemeRegistry::registerURLSchemeAsSecure(scheme);
2723dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
2724dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
27256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner- (void)_scaleWebView:(float)scale atOrigin:(NSPoint)origin
2726e14391e94c850b8bd03680c23b38978db68687a8John Reck{
2727e14391e94c850b8bd03680c23b38978db68687a8John Reck    Frame* coreFrame = [self _mainCoreFrame];
2728e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!coreFrame)
2729e14391e94c850b8bd03680c23b38978db68687a8John Reck        return;
2730e14391e94c850b8bd03680c23b38978db68687a8John Reck
27316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    coreFrame->scalePage(scale, IntPoint(origin));
2732e14391e94c850b8bd03680c23b38978db68687a8John Reck}
2733e14391e94c850b8bd03680c23b38978db68687a8John Reck
2734e14391e94c850b8bd03680c23b38978db68687a8John Reck- (float)_viewScaleFactor
2735e14391e94c850b8bd03680c23b38978db68687a8John Reck{
2736e14391e94c850b8bd03680c23b38978db68687a8John Reck    Frame* coreFrame = [self _mainCoreFrame];
2737e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!coreFrame)
2738e14391e94c850b8bd03680c23b38978db68687a8John Reck        return 1;
2739e14391e94c850b8bd03680c23b38978db68687a8John Reck
2740e14391e94c850b8bd03680c23b38978db68687a8John Reck    return coreFrame->pageScaleFactor();
2741e14391e94c850b8bd03680c23b38978db68687a8John Reck}
2742e14391e94c850b8bd03680c23b38978db68687a8John Reck
274365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setUseFixedLayout:(BOOL)fixed
274465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
274565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Frame* coreFrame = [self _mainCoreFrame];
274665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!coreFrame)
274765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
274865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
274965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    FrameView* view = coreFrame->view();
275065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!view)
275165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
275265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
275365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    view->setUseFixedLayout(fixed);
275465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!fixed)
275565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        view->setFixedLayoutSize(IntSize());
275665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
275765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
275865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setFixedLayoutSize:(NSSize)size
275965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
276065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Frame* coreFrame = [self _mainCoreFrame];
276165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!coreFrame)
276265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
276365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
276465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    FrameView* view = coreFrame->view();
276565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!view)
276665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
276765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
276865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    view->setFixedLayoutSize(IntSize(size));
276965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    view->forceLayout();
277065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
277165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
277265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)_useFixedLayout
277365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
277465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Frame* coreFrame = [self _mainCoreFrame];
277565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!coreFrame)
277665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NO;
277765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
277865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    FrameView* view = coreFrame->view();
277965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!view)
278065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NO;
278165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
278265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return view->useFixedLayout();
278365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
278465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
278565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSSize)_fixedLayoutSize
278665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
278765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Frame* coreFrame = [self _mainCoreFrame];
278865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!coreFrame)
278965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return IntSize();
279065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
279165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    FrameView* view = coreFrame->view();
279265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!view)
279365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return IntSize();
279465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
279565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return view->fixedLayoutSize();
279665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
279765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2798f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (NSUInteger)markAllMatchesForText:(NSString *)string caseSensitive:(BOOL)caseFlag highlight:(BOOL)highlight limit:(NSUInteger)limit
2799f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
2800f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [self countMatchesForText:string options:(caseFlag ? 0 : WebFindOptionsCaseInsensitive) highlight:highlight limit:limit markMatches:YES];
2801f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
2802f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
2803f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (NSUInteger)countMatchesForText:(NSString *)string caseSensitive:(BOOL)caseFlag highlight:(BOOL)highlight limit:(NSUInteger)limit markMatches:(BOOL)markMatches
2804f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
2805f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [self countMatchesForText:string options:(caseFlag ? 0 : WebFindOptionsCaseInsensitive) highlight:highlight limit:limit markMatches:markMatches];
2806f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
2807f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
2808f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (BOOL)searchFor:(NSString *)string direction:(BOOL)forward caseSensitive:(BOOL)caseFlag wrap:(BOOL)wrapFlag startInSelection:(BOOL)startInSelection
2809f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
2810f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [self findString:string options:((forward ? 0 : WebFindOptionsBackwards) | (caseFlag ? 0 : WebFindOptionsCaseInsensitive) | (wrapFlag ? WebFindOptionsWrapAround : 0) | (startInSelection ? WebFindOptionsStartInSelection : 0))];
2811f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
2812f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
2813f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch+ (void)_setLoadResourcesSerially:(BOOL)serialize
2814f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
2815f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    resourceLoadScheduler()->setSerialLoadingEnabled(serialize);
2816f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
2817f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
281881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch+ (double)_defaultMinimumTimerInterval
281981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
282081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return Settings::defaultMinDOMTimerInterval();
282181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
282281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
282381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch- (void)_setMinimumTimerInterval:(double)intervalInSeconds
282481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
282581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (_private->page)
282681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        _private->page->settings()->setMinDOMTimerInterval(intervalInSeconds);
282781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
282881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
28292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch+ (BOOL)_HTTPPipeliningEnabled
28302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
28312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return ResourceRequest::httpPipeliningEnabled();
28322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
28332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
28342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch+ (void)_setHTTPPipeliningEnabled:(BOOL)enabled
28352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
28362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ResourceRequest::setHTTPPipeliningEnabled(enabled);
28372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
28382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
28398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
28408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation _WebSafeForwarder
28428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Used to send messages to delegates that implement informal protocols.
28448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithTarget:(id)t defaultTarget:(id)dt catchExceptions:(BOOL)c
28468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
28478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super init];
28488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self)
28498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
28508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    target = t; // Non retained.
28518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    defaultTarget = dt;
28528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    catchExceptions = c;
28538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
28548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
28558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)forwardInvocation:(NSInvocation *)invocation
28578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
28588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([target respondsToSelector:[invocation selector]]) {
28598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (catchExceptions) {
28608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            @try {
28618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [invocation invokeWithTarget:target];
28628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } @catch(id exception) {
28638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ReportDiscardedDelegateException([invocation selector], exception);
28648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
28658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else
28668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [invocation invokeWithTarget:target];
28678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
28688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
28698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([defaultTarget respondsToSelector:[invocation selector]])
28718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [invocation invokeWithTarget:defaultTarget];
28728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Do nothing quietly if method not implemented.
28748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
28758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
28778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
28788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [defaultTarget methodSignatureForSelector:aSelector];
28798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
28808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
28828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView
28848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)initialize
28868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
28878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static BOOL initialized = NO;
28888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (initialized)
28898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
28908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    initialized = YES;
28918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    InitWebCoreSystemInterface();
289321939df44de1705786c545cd1bf519d47250322dBen Murdoch    JSC::initializeThreading();
289421939df44de1705786c545cd1bf519d47250322dBen Murdoch    WTF::initializeMainThreadToProcessMainThread();
28950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
28968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_applicationWillTerminate) name:NSApplicationWillTerminateNotification object:NSApp];
28972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_preferencesChangedNotification:) name:WebPreferencesChangedInternalNotification object:nil];
28988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_preferencesRemovedNotification:) name:WebPreferencesRemovedNotification object:nil];
28990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
29000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    continuousSpellCheckingEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebContinuousSpellCheckingEnabled];
29010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef BUILDING_ON_TIGER
29020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    grammarCheckingEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebGrammarCheckingEnabled];
29030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
29040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
29050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
29060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    automaticQuoteSubstitutionEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebAutomaticQuoteSubstitutionEnabled];
29070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    automaticLinkDetectionEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebAutomaticLinkDetectionEnabled];
29080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    automaticDashSubstitutionEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebAutomaticDashSubstitutionEnabled];
29090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    automaticTextReplacementEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebAutomaticTextReplacementEnabled];
29100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    automaticSpellingCorrectionEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:WebAutomaticSpellingCorrectionEnabled];
29110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
291268513a70bcd92384395513322f1b801e7bf9c729Steve Block
291368513a70bcd92384395513322f1b801e7bf9c729Steve Block#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
291468513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (![[NSUserDefaults standardUserDefaults] objectForKey:WebAutomaticTextReplacementEnabled])
291568513a70bcd92384395513322f1b801e7bf9c729Steve Block        automaticTextReplacementEnabled = [NSSpellChecker isAutomaticTextReplacementEnabled];
291668513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (![[NSUserDefaults standardUserDefaults] objectForKey:WebAutomaticSpellingCorrectionEnabled])
2917bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        automaticSpellingCorrectionEnabled = [NSSpellChecker isAutomaticSpellingCorrectionEnabled];
291868513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
29198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
29208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)_applicationWillTerminate
29228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
29238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    applicationIsTerminating = YES;
29240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
29250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (fastDocumentTeardownEnabled())
29260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [self closeAllWebViews];
29270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
29288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!pluginDatabaseClientCount)
29298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [WebPluginDatabase closeSharedDatabase];
29308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PageGroup::closeLocalStorage();
29328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
29338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2934643ca7872b450ea4efacab6188849e5aac2ba161Steve Block+ (BOOL)_canShowMIMEType:(NSString *)MIMEType allowingPlugins:(BOOL)allowPlugins
2935643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2936643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return [self _viewClass:nil andRepresentationClass:nil forMIMEType:MIMEType allowingPlugins:allowPlugins];
2937643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2938643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
29398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (BOOL)canShowMIMEType:(NSString *)MIMEType
29408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2941643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return [self _canShowMIMEType:MIMEType allowingPlugins:YES];
2942643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2943643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2944643ca7872b450ea4efacab6188849e5aac2ba161Steve Block- (BOOL)_canShowMIMEType:(NSString *)MIMEType
2945643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
294621939df44de1705786c545cd1bf519d47250322dBen Murdoch    return [[self class] _canShowMIMEType:MIMEType allowingPlugins:[_private->preferences arePlugInsEnabled]];
29478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
29488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebBasePluginPackage *)_pluginForMIMEType:(NSString *)MIMEType
29508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2951643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (![_private->preferences arePlugInsEnabled])
2952643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return nil;
2953643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
29548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebBasePluginPackage *pluginPackage = [[WebPluginDatabase sharedDatabase] pluginForMIMEType:MIMEType];
29558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (pluginPackage)
29568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return pluginPackage;
29578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->pluginDatabase)
29598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [_private->pluginDatabase pluginForMIMEType:MIMEType];
29608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return nil;
29628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
29638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2964967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
2965967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (WebBasePluginPackage *)_videoProxyPluginForMIMEType:(NSString *)MIMEType
2966967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
2967967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    WebBasePluginPackage *pluginPackage = [[WebPluginDatabase sharedDatabase] pluginForMIMEType:MIMEType];
2968967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (pluginPackage)
2969967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return pluginPackage;
2970967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
2971967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (_private->pluginDatabase)
2972967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return [_private->pluginDatabase pluginForMIMEType:MIMEType];
2973967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
2974967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return nil;
2975967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
2976967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif
2977967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
29788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebBasePluginPackage *)_pluginForExtension:(NSString *)extension
29798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2980643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (![_private->preferences arePlugInsEnabled])
2981643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return nil;
2982643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
29838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebBasePluginPackage *pluginPackage = [[WebPluginDatabase sharedDatabase] pluginForExtension:extension];
29848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (pluginPackage)
29858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return pluginPackage;
29868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->pluginDatabase)
29888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [_private->pluginDatabase pluginForExtension:extension];
29898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return nil;
29918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
29928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)addPluginInstanceView:(NSView *)view
29948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
29958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->pluginDatabase)
29968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->pluginDatabase = [[WebPluginDatabase alloc] init];
29978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private->pluginDatabase addPluginInstanceView:view];
29988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
29998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)removePluginInstanceView:(NSView *)view
30018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
30028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->pluginDatabase)
30038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_private->pluginDatabase removePluginInstanceView:view];
30048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)removePluginInstanceViewsFor:(WebFrame*)webFrame
30078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
30088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->pluginDatabase)
30098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_private->pluginDatabase removePluginInstanceViewsFor:webFrame];
30108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_isMIMETypeRegisteredAsPlugin:(NSString *)MIMEType
30138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3014643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (![_private->preferences arePlugInsEnabled])
3015643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return NO;
3016643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
30178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([[WebPluginDatabase sharedDatabase] isMIMETypeRegistered:MIMEType])
30188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return YES;
30198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->pluginDatabase && [_private->pluginDatabase isMIMETypeRegistered:MIMEType])
30218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return YES;
30228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NO;
30248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (BOOL)canShowMIMETypeAsHTML:(NSString *)MIMEType
30278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
30288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [WebFrameView _canShowMIMETypeAsHTML:MIMEType];
30298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSArray *)MIMETypesShownAsHTML
30328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
30338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableDictionary *viewTypes = [WebFrameView _viewTypesAllowImageTypeOmission:YES];
30348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSEnumerator *enumerator = [viewTypes keyEnumerator];
30358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id key;
30368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableArray *array = [[[NSMutableArray alloc] init] autorelease];
30378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((key = [enumerator nextObject])) {
30398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([viewTypes objectForKey:key] == [WebHTMLView class])
30408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [array addObject:key];
30418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
30428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return array;
30448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)setMIMETypesShownAsHTML:(NSArray *)MIMETypes
30478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
30488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSDictionary *viewTypes = [[WebFrameView _viewTypesAllowImageTypeOmission:YES] copy];
30498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSEnumerator *enumerator = [viewTypes keyEnumerator];
30508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id key;
30518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((key = [enumerator nextObject])) {
30528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([viewTypes objectForKey:key] == [WebHTMLView class])
30538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [WebView _unregisterViewClassAndRepresentationClassForMIMEType:key];
30548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
30558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int i, count = [MIMETypes count];
30578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i = 0; i < count; i++) {
30588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [WebView registerViewClass:[WebHTMLView class]
30598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                representationClass:[WebHTMLRepresentation class]
30608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                forMIMEType:[MIMETypes objectAtIndex:i]];
30618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
30628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [viewTypes release];
30638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSURL *)URLFromPasteboard:(NSPasteboard *)pasteboard
30668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
30678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [pasteboard _web_bestURL];
30688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSString *)URLTitleFromPasteboard:(NSPasteboard *)pasteboard
30718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
30728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [pasteboard stringForType:WebURLNamePboardType];
30738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)registerURLSchemeAsLocal:(NSString *)protocol
30768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
30770617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    SchemeRegistry::registerURLSchemeAsLocal(protocol);
30788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
30798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3080635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (id)_initWithArguments:(NSDictionary *) arguments
3081635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
3082635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    NSCoder *decoder = [arguments objectForKey:@"decoder"];
3083635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (decoder) {
3084635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        self = [self initWithCoder:decoder];
3085635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    } else {
3086635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT([arguments objectForKey:@"frame"]);
3087635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NSValue *frameValue = [arguments objectForKey:@"frame"];
3088635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NSRect frame = (frameValue ? [frameValue rectValue] : NSZeroRect);
3089635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NSString *frameName = [arguments objectForKey:@"frameName"];
3090635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NSString *groupName = [arguments objectForKey:@"groupName"];
3091635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        self = [self initWithFrame:frame frameName:frameName groupName:groupName];
3092635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
3093635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3094635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return self;
3095635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
3096635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
30970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic bool clientNeedsWebViewInitThreadWorkaround()
30980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
30990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITHOUT_WEBVIEW_INIT_THREAD_WORKAROUND))
31000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
31010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
31020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
31030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
31040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Installer.
31050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ([bundleIdentifier _webkit_isCaseInsensitiveEqualToString:@"com.apple.installer"])
31060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
31070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
31080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Automator.
31090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ([bundleIdentifier _webkit_isCaseInsensitiveEqualToString:@"com.apple.Automator"])
31100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
31110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
31120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Automator Runner.
31130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ([bundleIdentifier _webkit_isCaseInsensitiveEqualToString:@"com.apple.AutomatorRunner"])
31140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
31150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
31160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Automator workflows.
31170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ([bundleIdentifier _webkit_hasCaseInsensitivePrefix:@"com.apple.Automator."])
31180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
31190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
31200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if defined(BUILDING_ON_TIGER) || defined(BUILDING_ON_LEOPARD)
31210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Mail.
31220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ([bundleIdentifier _webkit_isCaseInsensitiveEqualToString:@"com.apple.Mail"])
31230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
31240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
31250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
31260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return false;
31270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
31280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic bool needsWebViewInitThreadWorkaround()
3130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
31310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static bool isOldClient = clientNeedsWebViewInitThreadWorkaround();
3132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return isOldClient && !pthread_main_np();
3133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
3134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
31358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithFrame:(NSRect)f
31368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
31378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self initWithFrame:f frameName:nil groupName:nil];
31388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithFrame:(NSRect)f frameName:(NSString *)frameName groupName:(NSString *)groupName
31418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needsWebViewInitThreadWorkaround())
3143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] initWithFrame:f frameName:frameName groupName:groupName];
3144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3145563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
31468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _initWithFrame:f frameName:frameName groupName:groupName usesDocumentViews:YES];
31478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
31488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithCoder:(NSCoder *)decoder
31508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needsWebViewInitThreadWorkaround())
3152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] initWithCoder:decoder];
3153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3154563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
31558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView *result = nil;
31568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    @try {
31588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSString *frameName;
31598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSString *groupName;
31608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebPreferences *preferences;
31618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BOOL useBackForwardList = NO;
31628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BOOL allowsUndo = YES;
31638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = [super initWithCoder:decoder];
31658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result->_private = [[WebViewPrivate alloc] init];
31668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // We don't want any of the archived subviews. The subviews will always
31688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // be created in _commonInitializationFrameName:groupName:.
31698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[result subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
31708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([decoder allowsKeyedCoding]) {
31728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frameName = [decoder decodeObjectForKey:@"FrameName"];
31738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            groupName = [decoder decodeObjectForKey:@"GroupName"];
31748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            preferences = [decoder decodeObjectForKey:@"Preferences"];
31758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            useBackForwardList = [decoder decodeBoolForKey:@"UseBackForwardList"];
31768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ([decoder containsValueForKey:@"AllowsUndo"])
31778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                allowsUndo = [decoder decodeBoolForKey:@"AllowsUndo"];
31788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
31798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int version;
31808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [decoder decodeValueOfObjCType:@encode(int) at:&version];
31818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frameName = [decoder decodeObject];
31828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            groupName = [decoder decodeObject];
31838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            preferences = [decoder decodeObject];
31848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (version > 1)
31858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [decoder decodeValuesOfObjCTypes:"c", &useBackForwardList];
31868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // The allowsUndo field is no longer written out in encodeWithCoder, but since there are
31878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // version 3 NIBs that have this field encoded, we still need to read it in.
31888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (version == 3)
31898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [decoder decodeValuesOfObjCTypes:"c", &allowsUndo];
31908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
31918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (![frameName isKindOfClass:[NSString class]])
31938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frameName = nil;
31948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (![groupName isKindOfClass:[NSString class]])
31958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            groupName = nil;
31968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (![preferences isKindOfClass:[WebPreferences class]])
31978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            preferences = nil;
31988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG(Encoding, "FrameName = %@, GroupName = %@, useBackForwardList = %d\n", frameName, groupName, (int)useBackForwardList);
32008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [result _commonInitializationWithFrameName:frameName groupName:groupName usesDocumentViews:YES];
3201e14391e94c850b8bd03680c23b38978db68687a8John Reck        static_cast<BackForwardListImpl*>([result page]->backForwardList())->setEnabled(useBackForwardList);
32028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result->_private->allowsUndo = allowsUndo;
32038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (preferences)
32048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [result setPreferences:preferences];
32058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } @catch (NSException *localException) {
32068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = nil;
32078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self release];
32088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
32098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
32118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)encodeWithCoder:(NSCoder *)encoder
32148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
32158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Set asside the subviews before we archive. We don't want to archive any subviews.
32168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The subviews will always be created in _commonInitializationFrameName:groupName:.
32178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id originalSubviews = _subviews;
32188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _subviews = nil;
32198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super encodeWithCoder:encoder];
32218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Restore the subviews we set aside.
32238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _subviews = originalSubviews;
32248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3225e14391e94c850b8bd03680c23b38978db68687a8John Reck    BOOL useBackForwardList = _private->page && static_cast<BackForwardListImpl*>(_private->page->backForwardList())->enabled();
32268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([encoder allowsKeyedCoding]) {
32278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [encoder encodeObject:[[self mainFrame] name] forKey:@"FrameName"];
32288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [encoder encodeObject:[self groupName] forKey:@"GroupName"];
32298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [encoder encodeObject:[self preferences] forKey:@"Preferences"];
32308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [encoder encodeBool:useBackForwardList forKey:@"UseBackForwardList"];
32318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [encoder encodeBool:_private->allowsUndo forKey:@"AllowsUndo"];
32328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
32338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int version = WebViewVersion;
32348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [encoder encodeValueOfObjCType:@encode(int) at:&version];
32358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [encoder encodeObject:[[self mainFrame] name]];
32368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [encoder encodeObject:[self groupName]];
32378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [encoder encodeObject:[self preferences]];
32388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [encoder encodeValuesOfObjCTypes:"c", &useBackForwardList];
32398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // DO NOT encode any new fields here, doing so will break older WebKit releases.
32408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
32418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG(Encoding, "FrameName = %@, GroupName = %@, useBackForwardList = %d\n", [[self mainFrame] name], [self groupName], (int)useBackForwardList);
32438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc
32468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
32478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (WebCoreObjCScheduleDeallocateOnMainThread([WebView class], self))
32488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
32498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // call close to ensure we tear-down completely
32518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // this maintains our old behavior for existing applications
32528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self close];
32538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3254692e5dbf12901edacf14812a6fae25462920af42Steve Block    if ([[self class] shouldIncludeInWebKitStatistics])
3255692e5dbf12901edacf14812a6fae25462920af42Steve Block        --WebViewCount;
3256692e5dbf12901edacf14812a6fae25462920af42Steve Block
32570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ([self _needsFrameLoadDelegateRetainQuirk])
32580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [_private->frameLoadDelegate release];
32590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
32608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private release];
32618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // [super dealloc] can end up dispatching against _private (3466082)
32628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private = nil;
32638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super dealloc];
32658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)finalize
32688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
32698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(_private->closed);
32708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    --WebViewCount;
32728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super finalize];
32748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)close
32778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
32788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // _close existed first, and some clients might be calling or overriding it, so call through.
32798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _close];
32808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setShouldCloseWithWindow:(BOOL)close
32838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
32848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->shouldCloseWithWindow = close;
32858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)shouldCloseWithWindow
32888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
32898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->shouldCloseWithWindow;
32908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
32918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)addWindowObserversForWindow:(NSWindow *)window
32938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
32940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (window) {
32958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidBecomeKey:)
32968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            name:NSWindowDidBecomeKeyNotification object:nil];
32978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidResignKey:)
32988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            name:NSWindowDidResignKeyNotification object:nil];
32998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowWillOrderOnScreen:)
33008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            name:WKWindowWillOrderOnScreenNotification() object:window];
33018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
33028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)removeWindowObservers
33058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSWindow *window = [self window];
33070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (window) {
33088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSNotificationCenter defaultCenter] removeObserver:self
33098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            name:NSWindowDidBecomeKeyNotification object:nil];
33108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSNotificationCenter defaultCenter] removeObserver:self
33118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            name:NSWindowDidResignKeyNotification object:nil];
33128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSNotificationCenter defaultCenter] removeObserver:self
33138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            name:WKWindowWillOrderOnScreenNotification() object:window];
33148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
33158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)viewWillMoveToWindow:(NSWindow *)window
33188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't do anything if the WebView isn't initialized.
33208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This happens when decoding a WebView in a nib.
33218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: What sets up the observer of NSWindowWillCloseNotification in this case?
33220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!_private || _private->closed)
33238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
33248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([self window] && [self window] != [self hostWindow])
33268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowWillCloseNotification object:[self window]];
33278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (window) {
33298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowWillClose:) name:NSWindowWillCloseNotification object:window];
33308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Ensure that we will receive the events that WebHTMLView (at least) needs.
33328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The following are expensive enough that we don't want to call them over
33338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // and over, so do them when we move into a window.
33348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [window setAcceptsMouseMovedEvents:YES];
33358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WKSetNSWindowShouldPostEventNotifications(window, YES);
3336692e5dbf12901edacf14812a6fae25462920af42Steve Block    } else {
3337692e5dbf12901edacf14812a6fae25462920af42Steve Block        _private->page->setCanStartMedia(false);
3338563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        _private->page->willMoveOffscreen();
3339692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
33400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
33410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (window != [self window]) {
33420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [self removeWindowObservers];
33430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [self addWindowObserversForWindow:window];
33440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
33458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)viewDidMoveToWindow
33488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't do anything if we aren't initialized.  This happens
33508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // when decoding a WebView.  When WebViews are decoded their subviews
33518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // are created by initWithCoder: and so won't be normally
33528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // initialized.  The stub views are discarded by WebView.
33538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private || _private->closed)
33548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
33558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3356692e5dbf12901edacf14812a6fae25462920af42Steve Block    if ([self window]) {
3357692e5dbf12901edacf14812a6fae25462920af42Steve Block        _private->page->setCanStartMedia(true);
33580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        _private->page->didMoveOnscreen();
3359692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
33608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [self _updateActiveState];
33628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_windowDidBecomeKey:(NSNotification *)notification
33658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSWindow *keyWindow = [notification object];
33678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (keyWindow == [self window] || keyWindow == [[self window] attachedSheet])
33680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [self _updateActiveState];
33698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_windowDidResignKey:(NSNotification *)notification
33728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSWindow *formerKeyWindow = [notification object];
33748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (formerKeyWindow == [self window] || formerKeyWindow == [[self window] attachedSheet])
33750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [self _updateActiveState];
33768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_windowWillOrderOnScreen:(NSNotification *)notification
33798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![self shouldUpdateWhileOffscreen])
33818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self setNeedsDisplay:YES];
33828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_windowWillClose:(NSNotification *)notification
33858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([self shouldCloseWithWindow] && ([self window] == [self hostWindow] || ([self window] && ![self hostWindow]) || (![self window] && [self hostWindow])))
33878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self close];
33888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
33898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setPreferences:(WebPreferences *)prefs
33918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
33928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!prefs)
33938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        prefs = [WebPreferences standardPreferences];
33948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->preferences == prefs)
33968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
33978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [prefs willAddToWebView];
33998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebPreferences *oldPrefs = _private->preferences;
34018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    [[NSNotificationCenter defaultCenter] removeObserver:self name:WebPreferencesChangedInternalNotification object:[self preferences]];
34038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [WebPreferences _removeReferenceForIdentifier:[oldPrefs identifier]];
34048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->preferences = [prefs retain];
34068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // After registering for the notification, post it so the WebCore settings update.
34088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_preferencesChangedNotification:)
34092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        name:WebPreferencesChangedInternalNotification object:[self preferences]];
34102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    [self _preferencesChanged:[self preferences]];
34112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    [[self preferences] _postPreferencesChangedAPINotification];
34128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [oldPrefs didRemoveFromWebView];
34148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [oldPrefs release];
34158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebPreferences *)preferences
34188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->preferences;
34208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setPreferencesIdentifier:(NSString *)anIdentifier
34238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->closed && ![anIdentifier isEqual:[[self preferences] identifier]]) {
34258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebPreferences *prefs = [[WebPreferences alloc] initWithIdentifier:anIdentifier];
34268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self setPreferences:prefs];
34278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [prefs release];
34288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
34298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)preferencesIdentifier
34328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[self preferences] identifier];
34348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setUIDelegate:delegate
34388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->UIDelegate = delegate;
34408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private->UIDelegateForwarder release];
34418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->UIDelegateForwarder = nil;
34428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3444967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (id)UIDelegate
34458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->UIDelegate;
34478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setResourceLoadDelegate: delegate
34508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->resourceProgressDelegate = delegate;
34528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _cacheResourceLoadDelegateImplementations];
34538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3455967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (id)resourceLoadDelegate
34568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->resourceProgressDelegate;
34588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setDownloadDelegate: delegate
34618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->downloadDelegate = delegate;
34638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3466967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (id)downloadDelegate
34678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->downloadDelegate;
34698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setPolicyDelegate:delegate
34728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->policyDelegate = delegate;
34748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private->policyDelegateForwarder release];
34758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->policyDelegateForwarder = nil;
34768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3478967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (id)policyDelegate
34798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->policyDelegate;
34818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
34828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setFrameLoadDelegate:delegate
34848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
34850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // <rdar://problem/6950660> - Due to some subtle WebKit changes - presumably to delegate callback behavior - we've
34860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // unconvered a latent bug in at least one WebKit app where the delegate wasn't properly retained by the app and
34870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // was dealloc'ed before being cleared.
34880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // This is an effort to keep such apps working for now.
34890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ([self _needsFrameLoadDelegateRetainQuirk]) {
34900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [delegate retain];
34910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [_private->frameLoadDelegate release];
34920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
34930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
34948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->frameLoadDelegate = delegate;
34958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _cacheFrameLoadDelegateImplementations];
34968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(ICONDATABASE)
34988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If this delegate wants callbacks for icons, fire up the icon database.
34998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->frameLoadDelegateImplementations.didReceiveIconForFrameFunc)
35008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [WebIconDatabase sharedIconDatabase];
35010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
35028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3504967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (id)frameLoadDelegate
35058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->frameLoadDelegate;
35078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebFrame *)mainFrame
35108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This can be called in initialization, before _private has been set up (3465613)
35120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!_private || !_private->page)
35138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
35148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return kit(_private->page->mainFrame());
35158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebFrame *)selectedFrame
35188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private->usesDocumentViews) {
35200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // If the first responder is a view in our tree, we get the frame containing the first responder.
35210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // This is faster than searching the frame hierarchy, and will give us a result even in the case
35220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // where the focused frame doesn't actually contain a selection.
35230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        WebFrame *focusedFrame = [self _focusedFrame];
35240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (focusedFrame)
35250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return focusedFrame;
35260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
35278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the first responder is outside of our view tree, we search for a frame containing a selection.
35298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // There should be at most only one of these.
35308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[self mainFrame] _findFrameWithSelection];
35318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebBackForwardList *)backForwardList
35348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
35368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
3537e14391e94c850b8bd03680c23b38978db68687a8John Reck    BackForwardListImpl* list = static_cast<BackForwardListImpl*>(_private->page->backForwardList());
3538e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!list->enabled())
35398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
3540e14391e94c850b8bd03680c23b38978db68687a8John Reck    return kit(list);
35418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)setMaintainsBackForwardList:(BOOL)flag
35448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
35468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3547e14391e94c850b8bd03680c23b38978db68687a8John Reck    static_cast<BackForwardListImpl*>(_private->page->backForwardList())->setEnabled(flag);
35488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)goBack
35518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
35538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
35548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->page->goBack();
35568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)goForward
35598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
35618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
35628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->page->goForward();
35648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)goToBackForwardItem:(WebHistoryItem *)item
35678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
35698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
35708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->page->goToItem(core(item), FrameLoadTypeIndexedBackForward);
35728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return YES;
35738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setTextSizeMultiplier:(float)m
35768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _setZoomMultiplier:m isTextOnly:![[NSUserDefaults standardUserDefaults] boolForKey:WebKitDebugFullPageZoomPreferenceKey]];
35788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (float)textSizeMultiplier
35818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3582635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return [self _realZoomMultiplierIsTextOnly] ? _private->zoomMultiplier : 1.0f;
35838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
35848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke- (void)_setZoomMultiplier:(float)multiplier isTextOnly:(BOOL)isTextOnly
35868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
35878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // NOTE: This has no visible effect when viewing a PDF (see <rdar://problem/4737380>)
35885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    _private->zoomMultiplier = multiplier;
358968513a70bcd92384395513322f1b801e7bf9c729Steve Block    _private->zoomsTextOnly = isTextOnly;
35905af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
359168513a70bcd92384395513322f1b801e7bf9c729Steve Block    // FIXME: It might be nice to rework this code so that _private->zoomMultiplier doesn't exist
359268513a70bcd92384395513322f1b801e7bf9c729Steve Block    // and instead the zoom factors stored in Frame are used.
35930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* coreFrame = [self _mainCoreFrame];
35945af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (coreFrame) {
359568513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (_private->zoomsTextOnly)
359668513a70bcd92384395513322f1b801e7bf9c729Steve Block            coreFrame->setPageAndTextZoomFactors(1, multiplier);
359768513a70bcd92384395513322f1b801e7bf9c729Steve Block        else
359868513a70bcd92384395513322f1b801e7bf9c729Steve Block            coreFrame->setPageAndTextZoomFactors(multiplier, 1);
35995af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
36008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
36018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (float)_zoomMultiplier:(BOOL)isTextOnly
36038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3604635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (isTextOnly != [self _realZoomMultiplierIsTextOnly])
36058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 1.0f;
36068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->zoomMultiplier;
36078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
36088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (float)_realZoomMultiplier
36108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
36118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->zoomMultiplier;
36128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
36138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_realZoomMultiplierIsTextOnly
36158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3616635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!_private->page)
3617635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return NO;
3618635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
361968513a70bcd92384395513322f1b801e7bf9c729Steve Block    return _private->zoomsTextOnly;
36208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
36218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define MinimumZoomMultiplier       0.5f
36238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define MaximumZoomMultiplier       3.0f
36248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ZoomMultiplierRatio         1.2f
36258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_canZoomOut:(BOOL)isTextOnly
36278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
36288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id docView = [[[self mainFrame] frameView] documentView];
36298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([docView conformsToProtocol:@protocol(_WebDocumentZooming)]) {
36308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id <_WebDocumentZooming> zoomingDocView = (id <_WebDocumentZooming>)docView;
36318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [zoomingDocView _canZoomOut];
36328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _zoomMultiplier:isTextOnly] / ZoomMultiplierRatio > MinimumZoomMultiplier;
36348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
36358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_canZoomIn:(BOOL)isTextOnly
36388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
36398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id docView = [[[self mainFrame] frameView] documentView];
36408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([docView conformsToProtocol:@protocol(_WebDocumentZooming)]) {
36418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id <_WebDocumentZooming> zoomingDocView = (id <_WebDocumentZooming>)docView;
36428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [zoomingDocView _canZoomIn];
36438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _zoomMultiplier:isTextOnly] * ZoomMultiplierRatio < MaximumZoomMultiplier;
36458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
36468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)_zoomOut:(id)sender isTextOnly:(BOOL)isTextOnly
36488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
36498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id docView = [[[self mainFrame] frameView] documentView];
36508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([docView conformsToProtocol:@protocol(_WebDocumentZooming)]) {
36518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id <_WebDocumentZooming> zoomingDocView = (id <_WebDocumentZooming>)docView;
36528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [zoomingDocView _zoomOut:sender];
36538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float newScale = [self _zoomMultiplier:isTextOnly] / ZoomMultiplierRatio;
36558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (newScale > MinimumZoomMultiplier)
36568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _setZoomMultiplier:newScale isTextOnly:isTextOnly];
36578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
36588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)_zoomIn:(id)sender isTextOnly:(BOOL)isTextOnly
36608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
36618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id docView = [[[self mainFrame] frameView] documentView];
36628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([docView conformsToProtocol:@protocol(_WebDocumentZooming)]) {
36638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id <_WebDocumentZooming> zoomingDocView = (id <_WebDocumentZooming>)docView;
36648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [zoomingDocView _zoomIn:sender];
36658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float newScale = [self _zoomMultiplier:isTextOnly] * ZoomMultiplierRatio;
36678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (newScale < MaximumZoomMultiplier)
36688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _setZoomMultiplier:newScale isTextOnly:isTextOnly];
36698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
36708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_canResetZoom:(BOOL)isTextOnly
36728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
36738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id docView = [[[self mainFrame] frameView] documentView];
36748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([docView conformsToProtocol:@protocol(_WebDocumentZooming)]) {
36758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id <_WebDocumentZooming> zoomingDocView = (id <_WebDocumentZooming>)docView;
36768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [zoomingDocView _canResetZoom];
36778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _zoomMultiplier:isTextOnly] != 1.0f;
36798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
36808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)_resetZoom:(id)sender isTextOnly:(BOOL)isTextOnly
36828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
36838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id docView = [[[self mainFrame] frameView] documentView];
36848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([docView conformsToProtocol:@protocol(_WebDocumentZooming)]) {
36858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id <_WebDocumentZooming> zoomingDocView = (id <_WebDocumentZooming>)docView;
36868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [zoomingDocView _resetZoom:sender];
36878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
36888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([self _zoomMultiplier:isTextOnly] != 1.0f)
36898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _setZoomMultiplier:1.0f isTextOnly:isTextOnly];
36908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
36918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setApplicationNameForUserAgent:(NSString *)applicationName
36938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
36948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *name = [applicationName copy];
36958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private->applicationNameForUserAgent release];
36968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->applicationNameForUserAgent = name;
36978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->userAgentOverridden)
36988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->userAgent = String();
36998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)applicationNameForUserAgent
37028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[_private->applicationNameForUserAgent retain] autorelease];
37048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setCustomUserAgent:(NSString *)userAgentString
37078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->userAgent = userAgentString;
37098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->userAgentOverridden = userAgentString != nil;
37108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)customUserAgent
37138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->userAgentOverridden)
37158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
37168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->userAgent;
37178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setMediaStyle:(NSString *)mediaStyle
37208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->mediaStyle != mediaStyle) {
37228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_private->mediaStyle release];
37238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->mediaStyle = [mediaStyle copy];
37248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)mediaStyle
37288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->mediaStyle;
37308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)supportsTextEncoding
37338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id documentView = [[[self mainFrame] frameView] documentView];
37358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [documentView conformsToProtocol:@protocol(WebDocumentText)]
37368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        && [documentView supportsTextEncoding];
37378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setCustomTextEncodingName:(NSString *)encoding
37408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *oldEncoding = [self customTextEncodingName];
37428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (encoding == oldEncoding || [encoding isEqualToString:oldEncoding])
37438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
37440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (Frame* mainFrame = [self _mainCoreFrame])
3745635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        mainFrame->loader()->reloadWithOverrideEncoding(encoding);
37468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)_mainFrameOverrideEncoding
37498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebDataSource *dataSource = [[self mainFrame] provisionalDataSource];
37518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dataSource == nil)
37528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dataSource = [[self mainFrame] _dataSource];
37538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dataSource == nil)
37548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
37558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return nsStringNilIfEmpty([dataSource _documentLoader]->overrideEncoding());
37568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)customTextEncodingName
37598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _mainFrameOverrideEncoding];
37618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
37648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Return statements are only valid in a function but some applications pass in scripts
37668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // prefixed with return (<rdar://problems/5103720&4616860>) since older WebKit versions
37678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // silently ignored the return. If the application is linked against an earlier version
37688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // of WebKit we will strip the return so the script wont fail.
37698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITHOUT_JAVASCRIPT_RETURN_QUIRK)) {
37708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSRange returnStringRange = [script rangeOfString:@"return "];
37718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (returnStringRange.length && !returnStringRange.location)
37728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            script = [script substringFromIndex:returnStringRange.location + returnStringRange.length];
37738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
37748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *result = [[self mainFrame] _stringByEvaluatingJavaScriptFromString:script];
37768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The only way stringByEvaluatingJavaScriptFromString can return nil is if the frame was removed by the script
37778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Since there's no way to get rid of the main frame, result will never ever be nil here.
37788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(result);
37798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
37818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebScriptObject *)windowScriptObject
37848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
37850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* coreFrame = [self _mainCoreFrame];
37868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!coreFrame)
37878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
37888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return coreFrame->script()->windowScriptObject();
37898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
37908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Get the appropriate user-agent string for a particular URL.
37928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)userAgentForURL:(NSURL *)url
37938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3794643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (_private->useSiteSpecificSpoofing) {
3795643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // No current site-specific spoofs.
3796643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
3797643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3798643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (_private->userAgent.isNull())
3799643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        _private->userAgent = [[self class] _standardUserAgentWithApplicationName:_private->applicationNameForUserAgent];
3800643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3801643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return _private->userAgent;
38028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
38038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setHostWindow:(NSWindow *)hostWindow
38058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (_private->closed && hostWindow)
38078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hostWindow == _private->hostWindow)
38098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
38108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* coreFrame = [self _mainCoreFrame];
38120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private->usesDocumentViews) {
38130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        for (Frame* frame = coreFrame; frame; frame = frame->tree()->traverseNext(coreFrame))
38140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [[[kit(frame) frameView] documentView] viewWillMoveToHostWindow:hostWindow];
38150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
38168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->hostWindow && [self window] != _private->hostWindow)
38178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowWillCloseNotification object:_private->hostWindow];
38188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hostWindow)
38198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowWillClose:) name:NSWindowWillCloseNotification object:hostWindow];
38208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private->hostWindow release];
38218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->hostWindow = [hostWindow retain];
38220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private->usesDocumentViews) {
38230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        for (Frame* frame = coreFrame; frame; frame = frame->tree()->traverseNext(coreFrame))
38240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [[[kit(frame) frameView] documentView] viewDidMoveToHostWindow];
38250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
38268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
38278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSWindow *)hostWindow
38298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3830563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // -[WebView hostWindow] can sometimes be called from the WebView's [super dealloc] method
3831563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // so we check here to make sure it's not null.
3832563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!_private)
3833563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return nil;
3834563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
38358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->hostWindow;
38368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
38378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSView <WebDocumentView> *)documentViewAtWindowPoint:(NSPoint)point
38398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
38408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[self _frameViewAtWindowPoint:point] documentView];
38418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
38428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSDictionary *)_elementAtWindowPoint:(NSPoint)windowPoint
38448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
38458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrameView *frameView = [self _frameViewAtWindowPoint:windowPoint];
38468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frameView)
38478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
38488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView <WebDocumentView> *documentView = [frameView documentView];
38498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([documentView conformsToProtocol:@protocol(WebDocumentElement)]) {
38508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSPoint point = [documentView convertPoint:windowPoint fromView:nil];
38518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [(NSView <WebDocumentElement> *)documentView elementAtPoint:point];
38528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
38538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [NSDictionary dictionaryWithObject:[frameView webFrame] forKey:WebElementFrameKey];
38548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
38558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSDictionary *)elementAtPoint:(NSPoint)point
38578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
38588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _elementAtWindowPoint:[self convertPoint:point toView:nil]];
38598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
38608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// The following 2 internal NSView methods are called on the drag destination to make scrolling while dragging work.
38628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Scrolling while dragging will only work if the drag destination is in a scroll view. The WebView is the drag destination.
38638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// When dragging to a WebView, the document subview should scroll, but it doesn't because it is not the drag destination.
38648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Forward these calls to the document subview to make its scroll view scroll.
38658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_autoscrollForDraggingInfo:(id)draggingInfo timeDelta:(NSTimeInterval)repeatDelta
38668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
38678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView <WebDocumentView> *documentView = [self documentViewAtWindowPoint:[draggingInfo draggingLocation]];
38688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [documentView _autoscrollForDraggingInfo:draggingInfo timeDelta:repeatDelta];
38698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
38708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_shouldAutoscrollForDraggingInfo:(id)draggingInfo
38728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
38738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView <WebDocumentView> *documentView = [self documentViewAtWindowPoint:[draggingInfo draggingLocation]];
38748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [documentView _shouldAutoscrollForDraggingInfo:draggingInfo];
38758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
38768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
387765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (DragApplicationFlags)applicationFlags:(id <NSDraggingInfo>)draggingInfo
387865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
387965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint32_t flags = 0;
388065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([NSApp modalWindow])
388165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        flags = DragApplicationIsModal;
388265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([[self window] attachedSheet])
388365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        flags |= DragApplicationHasAttachedSheet;
388465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([draggingInfo draggingSource] == self)
388565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        flags |= DragApplicationIsSource;
388665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask)
388765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        flags |= DragApplicationIsCopyKeyDown;
388865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return static_cast<DragApplicationFlags>(flags);
388965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
389065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)draggingInfo
38928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
38938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint client([draggingInfo draggingLocation]);
38948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint global(globalPoint([draggingInfo draggingLocation], [self window]));
389565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
38968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return core(self)->dragController()->dragEntered(&dragData);
38978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
38988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)draggingInfo
39008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
39018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Page* page = core(self);
39028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!page)
39038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NSDragOperationNone;
39048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint client([draggingInfo draggingLocation]);
39068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint global(globalPoint([draggingInfo draggingLocation], [self window]));
390765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
39088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return page->dragController()->dragUpdated(&dragData);
39098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
39108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)draggingExited:(id <NSDraggingInfo>)draggingInfo
39128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
39138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Page* page = core(self);
39148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!page)
39158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
39168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint client([draggingInfo draggingLocation]);
39188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint global(globalPoint([draggingInfo draggingLocation], [self window]));
391965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
39208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    page->dragController()->dragExited(&dragData);
39218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
39228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)draggingInfo
39248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
39258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return YES;
39268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
39278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)performDragOperation:(id <NSDraggingInfo>)draggingInfo
39298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
39308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint client([draggingInfo draggingLocation]);
39318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntPoint global(globalPoint([draggingInfo draggingLocation], [self window]));
393265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
39338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return core(self)->dragController()->performDrag(&dragData);
39348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
39358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (NSView *)_hitTest:(NSPoint *)point dragTypes:(NSSet *)types
39378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
39380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSView *hitView = [super _hitTest:point dragTypes:types];
39390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!hitView && [[self superview] mouse:*point inRect:[self frame]])
39408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return self;
39410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return hitView;
39428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
39438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)acceptsFirstResponder
39458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
39460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private->usesDocumentViews)
39470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return [[[self mainFrame] frameView] acceptsFirstResponder];
39480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
39490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME (Viewless): Need more code from WebHTMLView here.
39500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return YES;
39518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
39528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)becomeFirstResponder
39548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
39550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private->usesDocumentViews) {
39560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (_private->becomingFirstResponder) {
39570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // Fix for unrepro infinite recursion reported in Radar 4448181. If we hit this assert on
39580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // a debug build, we should figure out what causes the problem and do a better fix.
39590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            ASSERT_NOT_REACHED();
39600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return NO;
39610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
39620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
39630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // This works together with setNextKeyView to splice the WebView into
39640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // the key loop similar to the way NSScrollView does this. Note that
39650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // WebFrameView has very similar code.
39660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        NSWindow *window = [self window];
39670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        WebFrameView *mainFrameView = [[self mainFrame] frameView];
39680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
39690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        NSResponder *previousFirstResponder = [[self window] _oldFirstResponderBeforeBecoming];
39700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        BOOL fromOutside = ![previousFirstResponder isKindOfClass:[NSView class]] || (![(NSView *)previousFirstResponder isDescendantOf:self] && previousFirstResponder != self);
39710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
39720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ([window keyViewSelectionDirection] == NSSelectingPrevious) {
39730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            NSView *previousValidKeyView = [self previousValidKeyView];
39740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (previousValidKeyView != self && previousValidKeyView != mainFrameView) {
39750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                _private->becomingFirstResponder = YES;
39760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                _private->becomingFirstResponderFromOutside = fromOutside;
39770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                [window makeFirstResponder:previousValidKeyView];
39780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                _private->becomingFirstResponderFromOutside = NO;
39790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                _private->becomingFirstResponder = NO;
39800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return YES;
39810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            }
39820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return NO;
39830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
39848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ([mainFrameView acceptsFirstResponder]) {
39868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->becomingFirstResponder = YES;
39878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->becomingFirstResponderFromOutside = fromOutside;
39880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [window makeFirstResponder:mainFrameView];
39898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->becomingFirstResponderFromOutside = NO;
39908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->becomingFirstResponder = NO;
39918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return YES;
39920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
39930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
39940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return NO;
39958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
39960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
39970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME (Viewless): Need more code from WebHTMLView here.
39980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return YES;
39998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSView *)_webcore_effectiveFirstResponder
40028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private && _private->usesDocumentViews) {
40040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (WebFrameView *frameView = [[self mainFrame] frameView])
40050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return [frameView _webcore_effectiveFirstResponder];
40060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
40070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return [super _webcore_effectiveFirstResponder];
40088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)setNextKeyView:(NSView *)view
40118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private && _private->usesDocumentViews) {
40130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // This works together with becomeFirstResponder to splice the WebView into
40140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // the key loop similar to the way NSScrollView does this. Note that
40150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // WebFrameView has similar code.
40160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (WebFrameView *mainFrameView = [[self mainFrame] frameView]) {
40170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [mainFrameView setNextKeyView:view];
40180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return;
40190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
40208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
40210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
40220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [super setNextKeyView:view];
40238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4025f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic WebFrame *incrementFrame(WebFrame *frame, WebFindOptions options = 0)
40268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* coreFrame = core(frame);
4028f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return kit((options & WebFindOptionsBackwards)
4029f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        ? coreFrame->tree()->traversePreviousWithWrap(options & WebFindOptionsWrapAround)
4030f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        : coreFrame->tree()->traverseNextWithWrap(options & WebFindOptionsWrapAround));
40318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)searchFor:(NSString *)string direction:(BOOL)forward caseSensitive:(BOOL)caseFlag wrap:(BOOL)wrapFlag
40348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self searchFor:string direction:forward caseSensitive:caseFlag wrap:wrapFlag startInSelection:NO];
40368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)registerViewClass:(Class)viewClass representationClass:(Class)representationClass forMIMEType:(NSString *)MIMEType
40398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[WebFrameView _viewTypesAllowImageTypeOmission:YES] setObject:viewClass forKey:MIMEType];
40418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[WebDataSource _repTypesAllowImageTypeOmission:YES] setObject:representationClass forKey:MIMEType];
40428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: We also need to maintain MIMEType registrations (which can be dynamically changed)
40448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // in the WebCore MIMEType registry.  For now we're doing this in a safe, limited manner
40458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // to fix <rdar://problem/5372989> - a future revamping of the entire system is neccesary for future robustness
40468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([viewClass class] == [WebHTMLView class])
40478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        MIMETypeRegistry::getSupportedNonImageMIMETypes().add(MIMEType);
40488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setGroupName:(NSString *)groupName
40518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
40538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
40548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->page->setGroupName(groupName);
40558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)groupName
40588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
40608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
40618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->page->groupName();
40628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (double)estimatedProgress
40658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->page)
40678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0.0;
40688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->page->progress()->estimatedProgress();
40698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)pasteboardTypesForSelection
40728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView <WebDocumentView> *documentView = [[[self _selectedOrMainFrame] frameView] documentView];
40748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([documentView conformsToProtocol:@protocol(WebDocumentSelection)]) {
40758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [(NSView <WebDocumentSelection> *)documentView pasteboardTypesForSelection];
40768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
40778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [NSArray array];
40788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)writeSelectionWithPasteboardTypes:(NSArray *)types toPasteboard:(NSPasteboard *)pasteboard
40818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame *frame = [self _selectedOrMainFrame];
40838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (frame && [frame _hasSelection]) {
40848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSView <WebDocumentView> *documentView = [[frame frameView] documentView];
40858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([documentView conformsToProtocol:@protocol(WebDocumentSelection)])
40868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [(NSView <WebDocumentSelection> *)documentView writeSelectionWithPasteboardTypes:types toPasteboard:pasteboard];
40878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
40888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
40898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)pasteboardTypesForElement:(NSDictionary *)element
40918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
40928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([element objectForKey:WebElementImageURLKey] != nil) {
40938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [NSPasteboard _web_writableTypesForImageIncludingArchive:([element objectForKey:WebElementDOMNodeKey] != nil)];
40948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if ([element objectForKey:WebElementLinkURLKey] != nil) {
40958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [NSPasteboard _web_writableTypesForURL];
40968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if ([[element objectForKey:WebElementIsSelectedKey] boolValue]) {
40978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [self pasteboardTypesForSelection];
40988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
40998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [NSArray array];
41008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)writeElement:(NSDictionary *)element withPasteboardTypes:(NSArray *)types toPasteboard:(NSPasteboard *)pasteboard
41038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([element objectForKey:WebElementImageURLKey] != nil) {
41058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _writeImageForElement:element withPasteboardTypes:types toPasteboard:pasteboard];
41068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if ([element objectForKey:WebElementLinkURLKey] != nil) {
41078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _writeLinkElement:element withPasteboardTypes:types toPasteboard:pasteboard];
41088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if ([[element objectForKey:WebElementIsSelectedKey] boolValue]) {
41098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self writeSelectionWithPasteboardTypes:types toPasteboard:pasteboard];
41108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
41118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)moveDragCaretToPoint:(NSPoint)point
41148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (Page* page = core(self))
41168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        page->dragController()->placeDragCaret(IntPoint([self convertPoint:point toView:nil]));
41178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)removeDragCaret
41208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (Page* page = core(self))
41228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        page->dragController()->dragEnded();
41238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setMainFrameURL:(NSString *)URLString
41268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self mainFrame] loadRequest: [NSURLRequest requestWithURL: [NSURL _web_URLWithDataAsString: URLString]]];
41288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)mainFrameURL
41318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebDataSource *ds;
41338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ds = [[self mainFrame] provisionalDataSource];
41348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!ds)
41358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ds = [[self mainFrame] _dataSource];
41368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[[ds request] URL] _web_originalDataAsString];
41378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)isLoading
41408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG (Bindings, "isLoading = %d", (int)[self _isLoading]);
41428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _isLoading];
41438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)mainFrameTitle
41468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *mainFrameTitle = [[[self mainFrame] _dataSource] pageTitle];
41488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return (mainFrameTitle != nil) ? mainFrameTitle : (NSString *)@"";
41498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSImage *)mainFrameIcon
41528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[WebIconDatabase sharedIconDatabase] iconForURL:[[[[self mainFrame] _dataSource] _URL] _web_originalDataAsString] withSize:WebIconSmallSize];
41548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMDocument *)mainFrameDocument
41578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // only return the actual value if the state we're in gives NSTreeController
41598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // enough time to release its observers on the old model
41608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->mainFrameDocumentReady)
41618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [[self mainFrame] DOMDocument];
41628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return nil;
41638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setDrawsBackground:(BOOL)drawsBackground
41668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->drawsBackground == drawsBackground)
41688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
41698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->drawsBackground = drawsBackground;
41708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self mainFrame] _updateBackgroundAndUpdatesWhileOffscreen];
41718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)drawsBackground
41748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // This method can be called beneath -[NSView dealloc] after we have cleared _private,
4176635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // indirectly via -[WebFrameView viewDidMoveToWindow].
4177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return !_private || _private->drawsBackground;
41788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setShouldUpdateWhileOffscreen:(BOOL)updateWhileOffscreen
41818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->shouldUpdateWhileOffscreen == updateWhileOffscreen)
41838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
41848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->shouldUpdateWhileOffscreen = updateWhileOffscreen;
41858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self mainFrame] _updateBackgroundAndUpdatesWhileOffscreen];
41868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)shouldUpdateWhileOffscreen
41898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->shouldUpdateWhileOffscreen;
41918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setCurrentNodeHighlight:(WebNodeHighlight *)nodeHighlight
41948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
41958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id old = _private->currentNodeHighlight;
41968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->currentNodeHighlight = [nodeHighlight retain];
41978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [old release];
41988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
41998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebNodeHighlight *)currentNodeHighlight
42018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
42028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->currentNodeHighlight;
42038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
42048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (NSView *)previousValidKeyView
42060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
42070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSView *result = [super previousValidKeyView];
42080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
42090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Work around AppKit bug 6905484. If the result is a view that's inside this one, it's
42100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // possible it is the wrong answer, because the fact that it's a descendant causes the
42110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // code that implements key view redirection to fail; this means we won't redirect to
42120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // the toolbar, for example, when we hit the edge of a window. Since the bug is specific
42130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // to cases where the receiver of previousValidKeyView is an ancestor of the last valid
42140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // key view in the loop, we can sidestep it by walking along previous key views until
42150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // we find one that is not a superview, then using that to call previousValidKeyView.
42160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
42170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (![result isDescendantOf:self])
42180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return result;
42190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
42200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Use a visited set so we don't loop indefinitely when walking crazy key loops.
42210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // AppKit uses such sets internally and we want our loop to be as robust as its loops.
42220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RetainPtr<CFMutableSetRef> visitedViews = CFSetCreateMutable(0, 0, 0);
42230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CFSetAddValue(visitedViews.get(), result);
42240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
42250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSView *previousView = self;
42260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    do {
42270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CFSetAddValue(visitedViews.get(), previousView);
42280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        previousView = [previousView previousKeyView];
42290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!previousView || CFSetGetValue(visitedViews.get(), previousView))
42300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return result;
42310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } while ([result isDescendantOf:previousView]);
42320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return [previousView previousValidKeyView];
42330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
42340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
42358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
42368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (WebIBActions)
42388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)takeStringURLFrom: sender
42408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
42418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *URLString = [sender stringValue];
42428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self mainFrame] loadRequest: [NSURLRequest requestWithURL: [NSURL _web_URLWithDataAsString: URLString]]];
42448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
42458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)canGoBack
42478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4248f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (!_private->page || _private->page->defersLoading())
42498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
42508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !!_private->page->backForwardList()->backItem();
42528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
42538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)canGoForward
42558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4256f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (!_private->page || _private->page->defersLoading())
42578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
42588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return !!_private->page->backForwardList()->forwardItem();
42608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
42618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)goBack:(id)sender
42638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
42648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self goBack];
42658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
42668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)goForward:(id)sender
42688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
42698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self goForward];
42708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
42718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)stopLoading:(id)sender
42738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
42748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self mainFrame] stopLoading];
42758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
42768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)reload:(id)sender
42788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
42798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self mainFrame] reload];
42808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
42818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (IBAction)reloadFromOrigin:(id)sender
4283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
4284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    [[self mainFrame] reloadFromOrigin];
4285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
4286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
42878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: This code should move into WebCore so that it is not duplicated in each WebKit.
42888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// (This includes canMakeTextSmaller/Larger, makeTextSmaller/Larger, and canMakeTextStandardSize/makeTextStandardSize)
42898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)canMakeTextSmaller
42908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
42918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _canZoomOut:![[NSUserDefaults standardUserDefaults] boolForKey:WebKitDebugFullPageZoomPreferenceKey]];
42928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
42938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)makeTextSmaller:(id)sender
42958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
42968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _zoomOut:sender isTextOnly:![[NSUserDefaults standardUserDefaults] boolForKey:WebKitDebugFullPageZoomPreferenceKey]];
42978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
42988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)canMakeTextLarger
43008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
43018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _canZoomIn:![[NSUserDefaults standardUserDefaults] boolForKey:WebKitDebugFullPageZoomPreferenceKey]];
43028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
43038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)makeTextLarger:(id)sender
43058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
43068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _zoomIn:sender isTextOnly:![[NSUserDefaults standardUserDefaults] boolForKey:WebKitDebugFullPageZoomPreferenceKey]];
43078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
43088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)canMakeTextStandardSize
43108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
43118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _canResetZoom:![[NSUserDefaults standardUserDefaults] boolForKey:WebKitDebugFullPageZoomPreferenceKey]];
43128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
43138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)makeTextStandardSize:(id)sender
43158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
43168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   return [self _resetZoom:sender isTextOnly:![[NSUserDefaults standardUserDefaults] boolForKey:WebKitDebugFullPageZoomPreferenceKey]];
43178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
43188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)toggleSmartInsertDelete:(id)sender
43208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
43218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setSmartInsertDeleteEnabled:![self smartInsertDeleteEnabled]];
43228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
43238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)toggleContinuousSpellChecking:(id)sender
43258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
43268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setContinuousSpellCheckingEnabled:![self isContinuousSpellCheckingEnabled]];
43278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
43288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_responderValidateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item
43308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
43318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id responder = [self _responderForResponderOperations];
43328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (responder != self && [responder respondsToSelector:[item action]]) {
43338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([responder respondsToSelector:@selector(validateUserInterfaceItemWithoutDelegate:)])
43348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return [responder validateUserInterfaceItemWithoutDelegate:item];
43358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([responder respondsToSelector:@selector(validateUserInterfaceItem:)])
43368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return [responder validateUserInterfaceItem:item];
43378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return YES;
43388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
43398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NO;
43408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
43418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define VALIDATE(name) \
43438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (action == @selector(name:)) { return [self _responderValidateUserInterfaceItem:item]; }
43448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)validateUserInterfaceItemWithoutDelegate:(id <NSValidatedUserInterfaceItem>)item
43468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
43478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SEL action = [item action];
43488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (action == @selector(goBack:)) {
43508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [self canGoBack];
43518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (action == @selector(goForward:)) {
43528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [self canGoForward];
43538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (action == @selector(makeTextLarger:)) {
43548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [self canMakeTextLarger];
43558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (action == @selector(makeTextSmaller:)) {
43568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [self canMakeTextSmaller];
43578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (action == @selector(makeTextStandardSize:)) {
43588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [self canMakeTextStandardSize];
43598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (action == @selector(reload:)) {
43608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [[self mainFrame] _dataSource] != nil;
43618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (action == @selector(stopLoading:)) {
43628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [self _isLoading];
43638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (action == @selector(toggleContinuousSpellChecking:)) {
43648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BOOL checkMark = NO;
43658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BOOL retVal = NO;
43668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([self _continuousCheckingAllowed]) {
43678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            checkMark = [self isContinuousSpellCheckingEnabled];
43688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            retVal = YES;
43698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([(NSObject *)item isKindOfClass:[NSMenuItem class]]) {
43718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSMenuItem *menuItem = (NSMenuItem *)item;
43728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [menuItem setState:checkMark ? NSOnState : NSOffState];
43738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return retVal;
43750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } else if (action == @selector(toggleSmartInsertDelete:)) {
43760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        BOOL checkMark = [self smartInsertDeleteEnabled];
43770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ([(NSObject *)item isKindOfClass:[NSMenuItem class]]) {
43780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            NSMenuItem *menuItem = (NSMenuItem *)item;
43790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [menuItem setState:checkMark ? NSOnState : NSOffState];
43800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
43810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return YES;
43828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
43838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (action == @selector(toggleGrammarChecking:)) {
43848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BOOL checkMark = [self isGrammarCheckingEnabled];
43858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([(NSObject *)item isKindOfClass:[NSMenuItem class]]) {
43868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSMenuItem *menuItem = (NSMenuItem *)item;
43878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [menuItem setState:checkMark ? NSOnState : NSOffState];
43888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return YES;
43908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
43910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
43920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } else if (action == @selector(toggleAutomaticQuoteSubstitution:)) {
43930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        BOOL checkMark = [self isAutomaticQuoteSubstitutionEnabled];
43940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ([(NSObject *)item isKindOfClass:[NSMenuItem class]]) {
43950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            NSMenuItem *menuItem = (NSMenuItem *)item;
43960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [menuItem setState:checkMark ? NSOnState : NSOffState];
43970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
43980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return YES;
43990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } else if (action == @selector(toggleAutomaticLinkDetection:)) {
44000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        BOOL checkMark = [self isAutomaticLinkDetectionEnabled];
44010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ([(NSObject *)item isKindOfClass:[NSMenuItem class]]) {
44020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            NSMenuItem *menuItem = (NSMenuItem *)item;
44030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [menuItem setState:checkMark ? NSOnState : NSOffState];
44040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
44050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return YES;
44060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } else if (action == @selector(toggleAutomaticDashSubstitution:)) {
44070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        BOOL checkMark = [self isAutomaticDashSubstitutionEnabled];
44080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ([(NSObject *)item isKindOfClass:[NSMenuItem class]]) {
44090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            NSMenuItem *menuItem = (NSMenuItem *)item;
44100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [menuItem setState:checkMark ? NSOnState : NSOffState];
44110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
44120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return YES;
44130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } else if (action == @selector(toggleAutomaticTextReplacement:)) {
44140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        BOOL checkMark = [self isAutomaticTextReplacementEnabled];
44150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ([(NSObject *)item isKindOfClass:[NSMenuItem class]]) {
44160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            NSMenuItem *menuItem = (NSMenuItem *)item;
44170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [menuItem setState:checkMark ? NSOnState : NSOffState];
44180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
44190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return YES;
44200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } else if (action == @selector(toggleAutomaticSpellingCorrection:)) {
44210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        BOOL checkMark = [self isAutomaticSpellingCorrectionEnabled];
44220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ([(NSObject *)item isKindOfClass:[NSMenuItem class]]) {
44230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            NSMenuItem *menuItem = (NSMenuItem *)item;
44240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [menuItem setState:checkMark ? NSOnState : NSOffState];
44250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
44260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return YES;
44270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
44288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FOR_EACH_RESPONDER_SELECTOR(VALIDATE)
44308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return YES;
44328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
44338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item
44358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
44368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL result = [self validateUserInterfaceItemWithoutDelegate:item];
44378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return CallUIDelegateReturningBoolean(result, self, @selector(webView:validateUserInterfaceItem:defaultValidation:), item, result);
44388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
44398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
44418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (WebPendingPublic)
44438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)scheduleInRunLoop:(NSRunLoop *)runLoop forMode:(NSString *)mode
44458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
44468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (runLoop && mode)
44478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        core(self)->addSchedulePair(SchedulePair::create(runLoop, (CFStringRef)mode));
44488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
44498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)unscheduleFromRunLoop:(NSRunLoop *)runLoop forMode:(NSString *)mode
44518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
44528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (runLoop && mode)
44538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        core(self)->removeSchedulePair(SchedulePair::create(runLoop, (CFStringRef)mode));
44548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
44558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4456f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic BOOL findString(NSView <WebDocumentSearching> *searchView, NSString *string, WebFindOptions options)
4457f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
4458f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([searchView conformsToProtocol:@protocol(WebDocumentOptionsSearching)])
4459cad810f21b803229eb11403f9209855525a25d57Steve Block        return [(NSView <WebDocumentOptionsSearching> *)searchView _findString:string options:options];
4460f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([searchView conformsToProtocol:@protocol(WebDocumentIncrementalSearching)])
4461f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return [(NSView <WebDocumentIncrementalSearching> *)searchView searchFor:string direction:!(options & WebFindOptionsBackwards) caseSensitive:!(options & WebFindOptionsCaseInsensitive) wrap:!!(options & WebFindOptionsWrapAround) startInSelection:!!(options & WebFindOptionsStartInSelection)];
4462f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [searchView searchFor:string direction:!(options & WebFindOptionsBackwards) caseSensitive:!(options & WebFindOptionsCaseInsensitive) wrap:!!(options & WebFindOptionsWrapAround)];
4463f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
4464f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
4465f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (BOOL)findString:(NSString *)string options:(WebFindOptions)options
44668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
44678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->closed)
44688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
44698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the frame holding the selection, or start with the main frame
44718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame *startFrame = [self _selectedOrMainFrame];
44728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Search the first frame, then all the other frames, in order
44748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView <WebDocumentSearching> *startSearchView = nil;
44758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame *frame = startFrame;
44768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
4477f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        WebFrame *nextFrame = incrementFrame(frame, options);
44788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BOOL onlyOneFrame = (frame == nextFrame);
44808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(!onlyOneFrame || frame == startFrame);
44818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id <WebDocumentView> view = [[frame frameView] documentView];
44838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([view conformsToProtocol:@protocol(WebDocumentSearching)]) {
44848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSView <WebDocumentSearching> *searchView = (NSView <WebDocumentSearching> *)view;
44858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (frame == startFrame)
44878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                startSearchView = searchView;
44888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // In some cases we have to search some content twice; see comment later in this method.
4490f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            // We can avoid ever doing this in the common one-frame case by passing the wrap option through
44918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // here, and then bailing out before we get to the code that would search again in the
44928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // same content.
4493f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            WebFindOptions optionsForThisPass = onlyOneFrame ? options : (options & ~WebFindOptionsWrapAround);
4494f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
4495f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (findString(searchView, string, optionsForThisPass)) {
44968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (frame != startFrame)
44978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    [startFrame _clearSelection];
44988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [[self window] makeFirstResponder:searchView];
44998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return YES;
45008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
45018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (onlyOneFrame)
45038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return NO;
45048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
45058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        frame = nextFrame;
45068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (frame && frame != startFrame);
45078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4508f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // If there are multiple frames and WebFindOptionsWrapAround is set and we've visited each one without finding a result, we still need to search in the
45098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // first-searched frame up to the selection. However, the API doesn't provide a way to search only up to a particular point. The only
4510f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // way to make sure the entire frame is searched is to pass WebFindOptionsWrapAround. When there are no matches, this will search
45118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // some content that we already searched on the first pass. In the worst case, we could search the entire contents of this frame twice.
45128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // To fix this, we'd need to add a mechanism to specify a range in which to search.
4513f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ((options & WebFindOptionsWrapAround) && startSearchView) {
4514f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (findString(startSearchView, string, options)) {
45158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [[self window] makeFirstResponder:startSearchView];
45168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return YES;
45178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
45188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
45198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NO;
45208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
45218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setHoverFeedbackSuspended:(BOOL)newValue
45238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
45248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->hoverFeedbackSuspended == newValue)
45258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
45268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->hoverFeedbackSuspended = newValue;
45280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
45290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private->usesDocumentViews) {
45300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        id <WebDocumentView> documentView = [[[self mainFrame] frameView] documentView];
45310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // FIXME: in a perfect world we'd do this in a general way that worked with any document view,
45320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // such as by calling a protocol method or using respondsToSelector or sending a notification.
45330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // But until there is any need for these more general solutions, we'll just hardwire it to work
45340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // with WebHTMLView.
45350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Note that _hoverFeedbackSuspendedChanged needs to be called only on the main WebHTMLView, not
45360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // on each subframe separately.
45370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ([documentView isKindOfClass:[WebHTMLView class]])
45380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [(WebHTMLView *)documentView _hoverFeedbackSuspendedChanged];
45390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
45400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
45410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
45420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [self _updateMouseoverWithFakeEvent];
45438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
45448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)isHoverFeedbackSuspended
45468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
45478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->hoverFeedbackSuspended;
45488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
45498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setMainFrameDocumentReady:(BOOL)mainFrameDocumentReady
45518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
45528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // by setting this to NO, calls to mainFrameDocument are forced to return nil
45538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // setting this to YES lets it return the actual DOMDocument value
45548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // we use this to tell NSTreeController to reset its observers and clear its state
45558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->mainFrameDocumentReady == mainFrameDocumentReady)
45568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
45578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _willChangeValueForKey:_WebMainFrameDocumentKey];
45588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->mainFrameDocumentReady = mainFrameDocumentReady;
45598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _didChangeValueForKey:_WebMainFrameDocumentKey];
45608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // this will cause observers to call mainFrameDocument where this flag will be checked
45618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
45628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This method name is used by Mail on Tiger (but not post-Tiger), so we shouldn't delete it
45648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// until the day comes when we're no longer supporting Mail on Tiger.
45658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebFrame *)_frameForCurrentSelection
45668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
45678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _selectedOrMainFrame];
45688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
45698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setTabKeyCyclesThroughElements:(BOOL)cyclesElements
45718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
45728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->tabKeyCyclesThroughElementsChanged = YES;
45738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->page)
45748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->page->setTabKeyCyclesThroughElements(cyclesElements);
45758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
45768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)tabKeyCyclesThroughElements
45788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
45798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->page && _private->page->tabKeyCyclesThroughElements();
45808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
45818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setScriptDebugDelegate:(id)delegate
45838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
45848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->scriptDebugDelegate = delegate;
4585563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [self _cacheScriptDebugDelegateImplementations];
4586563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
45878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (delegate)
45888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _attachScriptDebuggerToAllFrames];
45898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
45908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _detachScriptDebuggerFromAllFrames];
45918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
45928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)scriptDebugDelegate
45948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
45958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->scriptDebugDelegate;
45968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4597231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4598231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block- (void)setHistoryDelegate:(id)delegate
4599231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
4600231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    _private->historyDelegate = delegate;
4601231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    [self _cacheHistoryDelegateImplementations];
4602231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
4603231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4604231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block- (id)historyDelegate
4605231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
4606231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return _private->historyDelegate;
4607231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
46088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)shouldClose
46108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
46110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* coreFrame = [self _mainCoreFrame];
46128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!coreFrame)
46138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return YES;
461406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return coreFrame->loader()->shouldClose();
46158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
46168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic NSAppleEventDescriptor* aeDescFromJSValue(ExecState* exec, JSValue jsValue)
46188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
46198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSAppleEventDescriptor* aeDesc = 0;
4620635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (jsValue.isBoolean())
4621635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [NSAppleEventDescriptor descriptorWithBoolean:jsValue.getBoolean()];
4622635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (jsValue.isString())
4623dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return [NSAppleEventDescriptor descriptorWithString:ustringToString(jsValue.getString(exec))];
4624635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (jsValue.isNumber()) {
4625635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        double value = jsValue.uncheckedGetNumber();
46268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int intValue = value;
46278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (value == intValue)
46288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return [NSAppleEventDescriptor descriptorWithDescriptorType:typeSInt32 bytes:&intValue length:sizeof(intValue)];
46298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [NSAppleEventDescriptor descriptorWithDescriptorType:typeIEEE64BitFloatingPoint bytes:&value length:sizeof(value)];
46308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4631635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (jsValue.isObject()) {
4632635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        JSObject* object = jsValue.getObject();
463381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (object->inherits(&DateInstance::s_info)) {
46348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DateInstance* date = static_cast<DateInstance*>(object);
4635cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            double ms = date->internalNumber();
4636cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            if (!isnan(ms)) {
46378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                CFAbsoluteTime utcSeconds = ms / 1000 - kCFAbsoluteTimeIntervalSince1970;
46388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                LongDateTime ldt;
46398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (noErr == UCConvertCFAbsoluteTimeToLongDateTime(utcSeconds, &ldt))
46408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    return [NSAppleEventDescriptor descriptorWithDescriptorType:typeLongDateTime bytes:&ldt length:sizeof(ldt)];
46418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
46428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
464381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        else if (object->inherits(&JSArray::s_info)) {
4644635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            DEFINE_STATIC_LOCAL(HashSet<JSObject*>, visitedElems, ());
46458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!visitedElems.contains(object)) {
46468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                visitedElems.add(object);
46478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                JSArray* array = static_cast<JSArray*>(object);
46498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                aeDesc = [NSAppleEventDescriptor listDescriptor];
46508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                unsigned numItems = array->length();
46518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                for (unsigned i = 0; i < numItems; ++i)
46528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    [aeDesc insertDescriptor:aeDescFromJSValue(exec, array->get(exec, i)) atIndex:0];
46538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                visitedElems.remove(object);
46558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return aeDesc;
46568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
46578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
46580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue primitive = object->toPrimitive(exec);
46598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (exec->hadException()) {
46608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            exec->clearException();
46618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return [NSAppleEventDescriptor nullDescriptor];
46628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
46638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return aeDescFromJSValue(exec, primitive);
46648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4665635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (jsValue.isUndefined())
46668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [NSAppleEventDescriptor descriptorWithTypeCode:cMissingValue];
4667635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(jsValue.isNull());
46688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [NSAppleEventDescriptor nullDescriptor];
46698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
46708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSAppleEventDescriptor *)aeDescByEvaluatingJavaScriptFromString:(NSString *)script
46728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
46730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* coreFrame = [self _mainCoreFrame];
46748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!coreFrame)
46758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
46768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!coreFrame->document())
46778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
4678cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    JSValue result = coreFrame->script()->executeScript(script, true).jsValue();
46798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!result) // FIXME: pass errors
46808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
46810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
4682cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return aeDescFromJSValue(coreFrame->script()->globalObject(mainThreadNormalWorld())->globalExec(), result);
46838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
46848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)canMarkAllTextMatches
46868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
468768513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (_private->closed)
468868513a70bcd92384395513322f1b801e7bf9c729Steve Block        return NO;
468968513a70bcd92384395513322f1b801e7bf9c729Steve Block
46908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame *frame = [self mainFrame];
46918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
46928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id <WebDocumentView> view = [[frame frameView] documentView];
46938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (view && ![view conformsToProtocol:@protocol(WebMultipleTextMatches)])
46948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return NO;
46958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4696f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        frame = incrementFrame(frame);
46978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (frame);
46988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return YES;
47008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
47018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4702f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (NSUInteger)countMatchesForText:(NSString *)string options:(WebFindOptions)options highlight:(BOOL)highlight limit:(NSUInteger)limit markMatches:(BOOL)markMatches
4703d06194330da2bb8da887d2e1adeacb3a5c1504b2Steve Block{
4704f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [self countMatchesForText:string inDOMRange:nil options:options highlight:highlight limit:limit markMatches:markMatches];
4705d06194330da2bb8da887d2e1adeacb3a5c1504b2Steve Block}
4706d06194330da2bb8da887d2e1adeacb3a5c1504b2Steve Block
4707f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (NSUInteger)countMatchesForText:(NSString *)string inDOMRange:(DOMRange *)range options:(WebFindOptions)options highlight:(BOOL)highlight limit:(NSUInteger)limit markMatches:(BOOL)markMatches
47085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
47095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (_private->closed)
47105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return 0;
47115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
47128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame *frame = [self mainFrame];
47138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned matchCount = 0;
47148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
47158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id <WebDocumentView> view = [[frame frameView] documentView];
47168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([view conformsToProtocol:@protocol(WebMultipleTextMatches)]) {
47175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            if (markMatches)
47185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen                [(NSView <WebMultipleTextMatches>*)view setMarkedTextMatchesAreHighlighted:highlight];
47198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(limit == 0 || matchCount < limit);
4721f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            matchCount += [(NSView <WebMultipleTextMatches>*)view countMatchesForText:string inDOMRange:range options:options limit:(limit == 0 ? 0 : limit - matchCount) markMatches:markMatches];
47228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Stop looking if we've reached the limit. A limit of 0 means no limit.
47248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (limit > 0 && matchCount >= limit)
47258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                break;
47268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4728f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        frame = incrementFrame(frame);
47298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (frame);
47308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return matchCount;
47328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
47338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)unmarkAllTextMatches
47358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
47365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (_private->closed)
47375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return;
47385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
47398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame *frame = [self mainFrame];
47408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
47418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id <WebDocumentView> view = [[frame frameView] documentView];
47428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([view conformsToProtocol:@protocol(WebMultipleTextMatches)])
47438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [(NSView <WebMultipleTextMatches>*)view unmarkAllTextMatches];
47448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4745f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        frame = incrementFrame(frame);
47468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (frame);
47478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
47488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)rectsForTextMatches
47508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
47515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (_private->closed)
47525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return [NSArray array];
47535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
47548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableArray *result = [NSMutableArray array];
47558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame *frame = [self mainFrame];
47568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
47578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id <WebDocumentView> view = [[frame frameView] documentView];
47588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([view conformsToProtocol:@protocol(WebMultipleTextMatches)]) {
47598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSView <WebMultipleTextMatches> *documentView = (NSView <WebMultipleTextMatches> *)view;
47608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSRect documentViewVisibleRect = [documentView visibleRect];
47618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSArray *originalRects = [documentView rectsForTextMatches];
47628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned rectCount = [originalRects count];
47638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned rectIndex;
47648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
47658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (rectIndex = 0; rectIndex < rectCount; ++rectIndex) {
47668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                NSRect r = [[originalRects objectAtIndex:rectIndex] rectValue];
47678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Clip rect to document view's visible rect so rect is confined to subframe
47688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                r = NSIntersectionRect(r, documentViewVisibleRect);
47698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (NSIsEmptyRect(r))
47708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    continue;
47718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // Convert rect to our coordinate system
47738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                r = [documentView convertRect:r toView:self];
47748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [result addObject:[NSValue valueWithRect:r]];
47758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (rectIndex % 10 == 0) {
47768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    [pool drain];
47778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    pool = [[NSAutoreleasePool alloc] init];
47788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
47798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
47808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [pool drain];
47818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
47828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4783f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        frame = incrementFrame(frame);
47848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (frame);
47858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
47878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
47888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)scrollDOMRangeToVisible:(DOMRange *)range
47908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
47918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[[[range startContainer] ownerDocument] webFrame] _scrollDOMRangeToVisible:range];
47928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
47938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)allowsUndo
47958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
47968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->allowsUndo;
47978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
47988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setAllowsUndo:(BOOL)flag
48008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->allowsUndo = flag;
48028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setPageSizeMultiplier:(float)m
48058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _setZoomMultiplier:m isTextOnly:NO];
48078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (float)pageSizeMultiplier
48108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4811635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return ![self _realZoomMultiplierIsTextOnly] ? _private->zoomMultiplier : 1.0f;
48128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)canZoomPageIn
48158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _canZoomIn:NO];
48178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)zoomPageIn:(id)sender
48208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _zoomIn:sender isTextOnly:NO];
48228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)canZoomPageOut
48258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _canZoomOut:NO];
48278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)zoomPageOut:(id)sender
48308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _zoomOut:sender isTextOnly:NO];
48328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)canResetPageZoom
48358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _canResetZoom:NO];
48378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (IBAction)resetPageZoom:(id)sender
48408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _resetZoom:sender isTextOnly:NO];
48428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4844635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)setMediaVolume:(float)volume
4845635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
4846635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (_private->page)
4847635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        _private->page->setMediaVolume(volume);
4848635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
4849635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4850635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (float)mediaVolume
4851635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
4852635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!_private->page)
4853635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return 0;
4854635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4855635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return _private->page->mediaVolume();
4856635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
4857635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4858cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block- (void)addVisitedLinks:(NSArray *)visitedLinks
4859cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
4860cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    PageGroup& group = core(self)->group();
4861cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
4862cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    NSEnumerator *enumerator = [visitedLinks objectEnumerator];
4863cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    while (NSString *url = [enumerator nextObject]) {
4864cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        size_t length = [url length];
4865cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        const UChar* characters = CFStringGetCharactersPtr(reinterpret_cast<CFStringRef>(url));
4866cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (characters)
4867cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            group.addVisitedLink(characters, length);
4868cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        else {
4869cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            Vector<UChar, 512> buffer(length);
4870cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            [url getCharacters:buffer.data()];
4871cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            group.addVisitedLink(buffer.data(), length);
4872cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        }
4873cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
4874cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
4875cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
48768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
48778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (WebViewPrintingPrivate)
48798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (float)_headerHeight
48818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return CallUIDelegateReturningFloat(self, @selector(webViewHeaderHeight:));
48838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (float)_footerHeight
48868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return CallUIDelegateReturningFloat(self, @selector(webViewFooterHeight:));
48888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_drawHeaderInRect:(NSRect)rect
48918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef DEBUG_HEADER_AND_FOOTER
48938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];
48948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [currentContext saveGraphicsState];
48958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSColor yellowColor] set];
48968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRectFill(rect);
48978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [currentContext restoreGraphicsState];
48988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
48998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SEL selector = @selector(webView:drawHeaderInRect:);
49018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![_private->UIDelegate respondsToSelector:selector])
49028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];
49058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [currentContext saveGraphicsState];
49068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRectClip(rect);
49088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallUIDelegate(self, selector, rect);
49098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [currentContext restoreGraphicsState];
49118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
49128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_drawFooterInRect:(NSRect)rect
49148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
49158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef DEBUG_HEADER_AND_FOOTER
49168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];
49178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [currentContext saveGraphicsState];
49188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSColor cyanColor] set];
49198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRectFill(rect);
49208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [currentContext restoreGraphicsState];
49218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
49228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SEL selector = @selector(webView:drawFooterInRect:);
49248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![_private->UIDelegate respondsToSelector:selector])
49258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
49268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];
49288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [currentContext saveGraphicsState];
49298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRectClip(rect);
49318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallUIDelegate(self, selector, rect);
49328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [currentContext restoreGraphicsState];
49348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
49358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_adjustPrintingMarginsForHeaderAndFooter
49378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
49388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSPrintOperation *op = [NSPrintOperation currentOperation];
49398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSPrintInfo *info = [op printInfo];
49408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableDictionary *infoDictionary = [info dictionary];
49418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We need to modify the top and bottom margins in the NSPrintInfo to account for the space needed by the
49438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // header and footer. Because this method can be called more than once on the same NSPrintInfo (see 5038087),
49448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // we stash away the unmodified top and bottom margins the first time this method is called, and we read from
49458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // those stashed-away values on subsequent calls.
49468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float originalTopMargin;
49478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float originalBottomMargin;
49488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSNumber *originalTopMarginNumber = [infoDictionary objectForKey:WebKitOriginalTopPrintingMarginKey];
49498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!originalTopMarginNumber) {
49508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(![infoDictionary objectForKey:WebKitOriginalBottomPrintingMarginKey]);
49518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        originalTopMargin = [info topMargin];
49528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        originalBottomMargin = [info bottomMargin];
49538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [infoDictionary setObject:[NSNumber numberWithFloat:originalTopMargin] forKey:WebKitOriginalTopPrintingMarginKey];
49548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [infoDictionary setObject:[NSNumber numberWithFloat:originalBottomMargin] forKey:WebKitOriginalBottomPrintingMarginKey];
49558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
49568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT([originalTopMarginNumber isKindOfClass:[NSNumber class]]);
49578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT([[infoDictionary objectForKey:WebKitOriginalBottomPrintingMarginKey] isKindOfClass:[NSNumber class]]);
49588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        originalTopMargin = [originalTopMarginNumber floatValue];
49598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        originalBottomMargin = [[infoDictionary objectForKey:WebKitOriginalBottomPrintingMarginKey] floatValue];
49608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
49618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float scale = [op _web_pageSetupScaleFactor];
49638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [info setTopMargin:originalTopMargin + [self _headerHeight] * scale];
49648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [info setBottomMargin:originalBottomMargin + [self _footerHeight] * scale];
49658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
49668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_drawHeaderAndFooter
49688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
49698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The header and footer rect height scales with the page, but the width is always
49708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // all the way across the printed page (inset by printing margins).
49718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSPrintOperation *op = [NSPrintOperation currentOperation];
49728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float scale = [op _web_pageSetupScaleFactor];
49738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSPrintInfo *printInfo = [op printInfo];
49748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSSize paperSize = [printInfo paperSize];
49758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float headerFooterLeft = [printInfo leftMargin]/scale;
49768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float headerFooterWidth = (paperSize.width - ([printInfo leftMargin] + [printInfo rightMargin]))/scale;
49778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRect footerRect = NSMakeRect(headerFooterLeft, [printInfo bottomMargin]/scale - [self _footerHeight] ,
49788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                   headerFooterWidth, [self _footerHeight]);
49798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSRect headerRect = NSMakeRect(headerFooterLeft, (paperSize.height - [printInfo topMargin])/scale,
49808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                   headerFooterWidth, [self _headerHeight]);
49818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _drawHeaderInRect:headerRect];
49838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _drawFooterInRect:footerRect];
49848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
49858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
49868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (WebDebugBinding)
49888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
49908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
49918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG (Bindings, "addObserver:%p forKeyPath:%@ options:%x context:%p", anObserver, keyPath, options, context);
49928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super addObserver:anObserver forKeyPath:keyPath options:options context:context];
49938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
49948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
49958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath
49968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
49978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG (Bindings, "removeObserver:%p forKeyPath:%@", anObserver, keyPath);
49988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super removeObserver:anObserver forKeyPath:keyPath];
49998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
50008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
50028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//==========================================================================================
50048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Editing
50058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (WebViewCSS)
50078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMCSSStyleDeclaration *)computedStyleForElement:(DOMElement *)element pseudoElement:(NSString *)pseudoElement
50098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
50108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: is this the best level for this conversion?
50118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (pseudoElement == nil)
50128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pseudoElement = @"";
50138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[element ownerDocument] getComputedStyle:element pseudoElement:pseudoElement];
50158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
50168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
50188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (WebViewEditing)
50208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMRange *)editableDOMRangeForPoint:(NSPoint)point
50228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
50238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Page* page = core(self);
50248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!page)
50258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
50268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return kit(page->mainFrame()->editor()->rangeForPoint(IntPoint([self convertPoint:point toView:nil])).get());
50278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
50288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5029563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)_shouldChangeSelectedDOMRange:(DOMRange *)currentRange toDOMRange:(DOMRange *)proposedRange affinity:(NSSelectionAffinity)selectionAffinity stillSelecting:(BOOL)flag
50308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
50318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This quirk is needed due to <rdar://problem/4985321> - We can phase it out once Aperture can adopt the new behavior on their end
50328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!WebKitLinkedOnOrAfter(WEBKIT_FIRST_VERSION_WITHOUT_APERTURE_QUIRK) && [[[NSBundle mainBundle] bundleIdentifier] isEqualToString:@"com.apple.Aperture"])
50338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return YES;
50348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[self _editingDelegateForwarder] webView:self shouldChangeSelectedDOMRange:currentRange toDOMRange:proposedRange affinity:selectionAffinity stillSelecting:flag];
50358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
50368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)maintainsInactiveSelection
50388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
50398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NO;
50408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
50418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setSelectedDOMRange:(DOMRange *)range affinity:(NSSelectionAffinity)selectionAffinity
50438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
50448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* coreFrame = core([self _selectedOrMainFrame]);
50458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!coreFrame)
50468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
50478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (range == nil)
50498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        coreFrame->selection()->clear();
50508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
50518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Derive the frame to use from the range passed in.
50528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Using _selectedOrMainFrame could give us a different document than
50538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // the one the range uses.
50548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        coreFrame = core([range startContainer])->document()->frame();
50558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!coreFrame)
50568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
50578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        coreFrame->selection()->setSelectedRange(core(range), core(selectionAffinity), true);
50598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
50608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
50618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMRange *)selectedDOMRange
50638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
50648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* coreFrame = core([self _selectedOrMainFrame]);
50658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!coreFrame)
50668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
5067563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return kit(coreFrame->selection()->toNormalizedRange().get());
50688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
50698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSSelectionAffinity)selectionAffinity
50718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
50728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* coreFrame = core([self _selectedOrMainFrame]);
50738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!coreFrame)
50748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NSSelectionAffinityDownstream;
50758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return kit(coreFrame->selection()->affinity());
50768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
50778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setEditable:(BOOL)flag
50798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
50802bde8e466a4451c7319e3a072d118917957d6554Steve Block    if ([self isEditable] != flag && _private->page) {
50812bde8e466a4451c7319e3a072d118917957d6554Steve Block        _private->page->setEditable(flag);
50822bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!_private->tabKeyCyclesThroughElementsChanged)
50838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->page->setTabKeyCyclesThroughElements(!flag);
50840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Frame* mainFrame = [self _mainCoreFrame];
50858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (mainFrame) {
50868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (flag) {
50875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                mainFrame->editor()->applyEditingStyleToBodyElement();
50888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                // If the WebView is made editable and the selection is empty, set it to something.
50898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (![self selectedDOMRange])
509068513a70bcd92384395513322f1b801e7bf9c729Steve Block                    mainFrame->selection()->setSelectionFromNone();
50915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            }
50928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
50938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
50948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
50958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
50968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)isEditable
50978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
50982bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _private->page && _private->page->isEditable();
50998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
51008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setTypingStyle:(DOMCSSStyleDeclaration *)style
51028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We don't know enough at thls level to pass in a relevant WebUndoAction; we'd have to
51048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // change the API to allow this.
51058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self _selectedOrMainFrame] _setTypingStyle:style withUndoAction:EditActionUnspecified];
51068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
51078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMCSSStyleDeclaration *)typingStyle
51098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[self _selectedOrMainFrame] _typingStyle];
51118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
51128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setSmartInsertDeleteEnabled:(BOOL)flag
51148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private->smartInsertDeleteEnabled != flag) {
51160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        _private->smartInsertDeleteEnabled = flag;
51170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [[NSUserDefaults standardUserDefaults] setBool:_private->smartInsertDeleteEnabled forKey:WebSmartInsertDeleteEnabled];
51180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
5119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (flag)
5120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        [self setSelectTrailingWhitespaceEnabled:false];
51218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
51228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)smartInsertDeleteEnabled
51248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->smartInsertDeleteEnabled;
51268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
51278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setContinuousSpellCheckingEnabled:(BOOL)flag
51298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (continuousSpellCheckingEnabled != flag) {
51318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        continuousSpellCheckingEnabled = flag;
51328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSUserDefaults standardUserDefaults] setBool:continuousSpellCheckingEnabled forKey:WebContinuousSpellCheckingEnabled];
51338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
51348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([self isContinuousSpellCheckingEnabled]) {
51368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[self class] _preflightSpellChecker];
51378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
51388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[self mainFrame] _unmarkAllMisspellings];
51398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
51408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
51418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)isContinuousSpellCheckingEnabled
51438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return (continuousSpellCheckingEnabled && [self _continuousCheckingAllowed]);
51458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
51468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSInteger)spellCheckerDocumentTag
51488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->hasSpellCheckerDocumentTag) {
51508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->spellCheckerDocumentTag = [NSSpellChecker uniqueSpellDocumentTag];
51518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->hasSpellCheckerDocumentTag = YES;
51528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
51538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->spellCheckerDocumentTag;
51548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
51558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSUndoManager *)undoManager
51578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->allowsUndo)
51598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
51608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSUndoManager *undoManager = [[self _editingDelegateForwarder] undoManagerForWebView:self];
51628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (undoManager)
51638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return undoManager;
51648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [super undoManager];
51668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
51678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)registerForEditingDelegateNotification:(NSString *)name selector:(SEL)selector
51698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
51718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([_private->editingDelegate respondsToSelector:selector])
51728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [defaultCenter addObserver:_private->editingDelegate selector:selector name:name object:self];
51738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
51748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setEditingDelegate:(id)delegate
51768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
51778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->editingDelegate == delegate)
51788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
51798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
51818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // remove notifications from current delegate
51838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [defaultCenter removeObserver:_private->editingDelegate name:WebViewDidBeginEditingNotification object:self];
51848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [defaultCenter removeObserver:_private->editingDelegate name:WebViewDidChangeNotification object:self];
51858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [defaultCenter removeObserver:_private->editingDelegate name:WebViewDidEndEditingNotification object:self];
51868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [defaultCenter removeObserver:_private->editingDelegate name:WebViewDidChangeTypingStyleNotification object:self];
51878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [defaultCenter removeObserver:_private->editingDelegate name:WebViewDidChangeSelectionNotification object:self];
51888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->editingDelegate = delegate;
51908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private->editingDelegateForwarder release];
51918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->editingDelegateForwarder = nil;
51928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // add notifications for new delegate
51948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self registerForEditingDelegateNotification:WebViewDidBeginEditingNotification selector:@selector(webViewDidBeginEditing:)];
51958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self registerForEditingDelegateNotification:WebViewDidChangeNotification selector:@selector(webViewDidChange:)];
51968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self registerForEditingDelegateNotification:WebViewDidEndEditingNotification selector:@selector(webViewDidEndEditing:)];
51978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self registerForEditingDelegateNotification:WebViewDidChangeTypingStyleNotification selector:@selector(webViewDidChangeTypingStyle:)];
51988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self registerForEditingDelegateNotification:WebViewDidChangeSelectionNotification selector:@selector(webViewDidChangeSelection:)];
51998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
52008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)editingDelegate
52028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
52038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->editingDelegate;
52048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
52058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMCSSStyleDeclaration *)styleDeclarationWithText:(NSString *)text
52078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
52088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Should this really be attached to the document with the current selection?
52098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DOMCSSStyleDeclaration *decl = [[[self _selectedOrMainFrame] DOMDocument] createCSSStyleDeclaration];
52108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [decl setCssText:text];
52118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return decl;
52128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
52138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
52158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (WebViewGrammarChecking)
52178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: This method should be merged into WebViewEditing when we're not in API freeze
52198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)isGrammarCheckingEnabled
52208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
52218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef BUILDING_ON_TIGER
52228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NO;
52238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
52248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return grammarCheckingEnabled;
52258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
52268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
52278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER
52298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: This method should be merged into WebViewEditing when we're not in API freeze
52308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setGrammarCheckingEnabled:(BOOL)flag
52318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
52328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (grammarCheckingEnabled == flag)
52338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
52348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    grammarCheckingEnabled = flag;
52368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSUserDefaults standardUserDefaults] setBool:grammarCheckingEnabled forKey:WebGrammarCheckingEnabled];
52378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef BUILDING_ON_LEOPARD
52390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [[NSSpellChecker sharedSpellChecker] updatePanels];
52400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
52418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSSpellChecker *spellChecker = [NSSpellChecker sharedSpellChecker];
52428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([spellChecker respondsToSelector:@selector(_updateGrammar)])
52438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [spellChecker performSelector:@selector(_updateGrammar)];
52440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
52458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We call _preflightSpellChecker when turning continuous spell checking on, but we don't need to do that here
52478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // because grammar checking only occurs on code paths that already preflight spell checking appropriately.
52488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![self isGrammarCheckingEnabled])
52508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[self mainFrame] _unmarkAllBadGrammar];
52518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
52528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: This method should be merged into WebIBActions when we're not in API freeze
52548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)toggleGrammarChecking:(id)sender
52558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
52568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self setGrammarCheckingEnabled:![self isGrammarCheckingEnabled]];
52578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
52588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
52598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
52618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch@implementation WebView (WebViewTextChecking)
52630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
52640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)isAutomaticQuoteSubstitutionEnabled
52650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
52660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if defined(BUILDING_ON_TIGER) || defined(BUILDING_ON_LEOPARD)
52670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NO;
52680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
52690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return automaticQuoteSubstitutionEnabled;
52700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
52710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
52720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
52730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)isAutomaticLinkDetectionEnabled
52740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
52750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if defined(BUILDING_ON_TIGER) || defined(BUILDING_ON_LEOPARD)
52760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NO;
52770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
52780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return automaticLinkDetectionEnabled;
52790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
52800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
52810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
52820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)isAutomaticDashSubstitutionEnabled
52830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
52840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if defined(BUILDING_ON_TIGER) || defined(BUILDING_ON_LEOPARD)
52850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NO;
52860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
52870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return automaticDashSubstitutionEnabled;
52880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
52890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
52900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
52910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)isAutomaticTextReplacementEnabled
52920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
52930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if defined(BUILDING_ON_TIGER) || defined(BUILDING_ON_LEOPARD)
52940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NO;
52950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
52960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return automaticTextReplacementEnabled;
52970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
52980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
52990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)isAutomaticSpellingCorrectionEnabled
53010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
53020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if defined(BUILDING_ON_TIGER) || defined(BUILDING_ON_LEOPARD)
53030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NO;
53040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
53050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return automaticSpellingCorrectionEnabled;
53060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
53070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
53080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
53100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)setAutomaticQuoteSubstitutionEnabled:(BOOL)flag
53120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
53130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (automaticQuoteSubstitutionEnabled == flag)
53140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
53150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    automaticQuoteSubstitutionEnabled = flag;
53160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [[NSUserDefaults standardUserDefaults] setBool:automaticQuoteSubstitutionEnabled forKey:WebAutomaticQuoteSubstitutionEnabled];
53170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [[NSSpellChecker sharedSpellChecker] updatePanels];
53180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
53190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)toggleAutomaticQuoteSubstitution:(id)sender
53210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
53220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [self setAutomaticQuoteSubstitutionEnabled:![self isAutomaticQuoteSubstitutionEnabled]];
53230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
53240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)setAutomaticLinkDetectionEnabled:(BOOL)flag
53260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
53270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (automaticLinkDetectionEnabled == flag)
53280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
53290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    automaticLinkDetectionEnabled = flag;
53300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [[NSUserDefaults standardUserDefaults] setBool:automaticLinkDetectionEnabled forKey:WebAutomaticLinkDetectionEnabled];
53310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [[NSSpellChecker sharedSpellChecker] updatePanels];
53320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
53330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)toggleAutomaticLinkDetection:(id)sender
53350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
53360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [self setAutomaticLinkDetectionEnabled:![self isAutomaticLinkDetectionEnabled]];
53370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
53380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)setAutomaticDashSubstitutionEnabled:(BOOL)flag
53400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
53410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (automaticDashSubstitutionEnabled == flag)
53420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
53430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    automaticDashSubstitutionEnabled = flag;
53440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [[NSUserDefaults standardUserDefaults] setBool:automaticDashSubstitutionEnabled forKey:WebAutomaticDashSubstitutionEnabled];
53450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [[NSSpellChecker sharedSpellChecker] updatePanels];
53460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
53470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)toggleAutomaticDashSubstitution:(id)sender
53490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
53500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [self setAutomaticDashSubstitutionEnabled:![self isAutomaticDashSubstitutionEnabled]];
53510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
53520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)setAutomaticTextReplacementEnabled:(BOOL)flag
53540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
53550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (automaticTextReplacementEnabled == flag)
53560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
53570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    automaticTextReplacementEnabled = flag;
53580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [[NSUserDefaults standardUserDefaults] setBool:automaticTextReplacementEnabled forKey:WebAutomaticTextReplacementEnabled];
53590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [[NSSpellChecker sharedSpellChecker] updatePanels];
53600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
53610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)toggleAutomaticTextReplacement:(id)sender
53630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
53640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [self setAutomaticTextReplacementEnabled:![self isAutomaticTextReplacementEnabled]];
53650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
53660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)setAutomaticSpellingCorrectionEnabled:(BOOL)flag
53680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
53690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (automaticSpellingCorrectionEnabled == flag)
53700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
53710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    automaticSpellingCorrectionEnabled = flag;
53720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [[NSUserDefaults standardUserDefaults] setBool:automaticSpellingCorrectionEnabled forKey:WebAutomaticSpellingCorrectionEnabled];
53730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [[NSSpellChecker sharedSpellChecker] updatePanels];
53740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
53750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)toggleAutomaticSpellingCorrection:(id)sender
53770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
53780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [self setAutomaticSpellingCorrectionEnabled:![self isAutomaticSpellingCorrectionEnabled]];
53790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
53800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
53820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53832bde8e466a4451c7319e3a072d118917957d6554Steve Block#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD)
53842bde8e466a4451c7319e3a072d118917957d6554Steve Block- (void)handleCorrectionPanelResult:(NSString*)result
53852bde8e466a4451c7319e3a072d118917957d6554Steve Block{
53862bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebFrame *webFrame = [self _selectedOrMainFrame];
53872bde8e466a4451c7319e3a072d118917957d6554Steve Block    Frame* coreFrame = core(webFrame);
53882bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (coreFrame)
53892bde8e466a4451c7319e3a072d118917957d6554Steve Block        coreFrame->editor()->handleCorrectionPanelResult(result);
53902bde8e466a4451c7319e3a072d118917957d6554Steve Block}
53912bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
53922bde8e466a4451c7319e3a072d118917957d6554Steve Block
53930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch@end
53940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
53958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (WebViewUndoableEditing)
53968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
53978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)replaceSelectionWithNode:(DOMNode *)node
53988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
53998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self _selectedOrMainFrame] _replaceSelectionWithNode:node selectReplacement:YES smartReplace:NO matchStyle:NO];
54008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
54018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)replaceSelectionWithText:(NSString *)text
54038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
54048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self _selectedOrMainFrame] _replaceSelectionWithText:text selectReplacement:YES smartReplace:NO];
54058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
54068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)replaceSelectionWithMarkupString:(NSString *)markupString
54088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
54098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self _selectedOrMainFrame] _replaceSelectionWithMarkupString:markupString baseURLString:nil selectReplacement:YES smartReplace:NO];
54108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
54118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)replaceSelectionWithArchive:(WebArchive *)archive
54138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
54148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[[self _selectedOrMainFrame] _dataSource] _replaceSelectionWithArchive:archive selectReplacement:YES];
54158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
54168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)deleteSelection
54188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
54198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame *webFrame = [self _selectedOrMainFrame];
54208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* coreFrame = core(webFrame);
54218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (coreFrame)
54228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        coreFrame->editor()->deleteSelectionWithSmartDelete([(WebHTMLView *)[[webFrame frameView] documentView] _canSmartCopyOrDelete]);
54238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
54248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)applyStyle:(DOMCSSStyleDeclaration *)style
54268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
54278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We don't know enough at thls level to pass in a relevant WebUndoAction; we'd have to
54288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // change the API to allow this.
54298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame *webFrame = [self _selectedOrMainFrame];
54308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* coreFrame = core(webFrame);
54318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (coreFrame)
54328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        coreFrame->editor()->applyStyle(core(style));
54338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
54348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
54368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (WebViewEditingActions)
54388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_performResponderOperation:(SEL)selector with:(id)parameter
54408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
54418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static BOOL reentered = NO;
54428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (reentered) {
54438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[self nextResponder] tryToPerform:selector with:parameter];
54448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
54458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
54468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // There are two possibilities here.
54488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //
54498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // One is that WebView has been called in its role as part of the responder chain.
54508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // In that case, it's fine to call the first responder and end up calling down the
54518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // responder chain again. Later we will return here with reentered = YES and continue
54528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // past the WebView.
54538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //
54548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The other is that we are being called directly, in which case we want to pass the
54558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // selector down to the view inside us that can handle it, and continue down the
54568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // responder chain as usual.
54578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Pass this selector down to the first responder.
54598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSResponder *responder = [self _responderForResponderOperations];
54608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    reentered = YES;
54618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [responder tryToPerform:selector with:parameter];
54628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    reentered = NO;
54638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
54648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define FORWARD(name) \
54668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    - (void)name:(id)sender { [self _performResponderOperation:_cmd with:sender]; }
54678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFOR_EACH_RESPONDER_SELECTOR(FORWARD)
54698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)insertText:(NSString *)text
54718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
54728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _performResponderOperation:_cmd with:text];
54738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
54748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
54768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (WebViewEditingInMail)
54788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5479563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)_insertNewlineInQuotedContent
54808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
54818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self _selectedOrMainFrame] _insertParagraphSeparatorInQuotedContent];
54828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
54838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_replaceSelectionWithNode:(DOMNode *)node matchStyle:(BOOL)matchStyle
54858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
54868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self _selectedOrMainFrame] _replaceSelectionWithNode:node selectReplacement:YES smartReplace:NO matchStyle:matchStyle];
54878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
54888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
54890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)_selectionIsCaret
54900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
54910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* coreFrame = core([self _selectedOrMainFrame]);
54920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!coreFrame)
54930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return NO;
54940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return coreFrame->selection()->isCaret();
54950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
54960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
54970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)_selectionIsAll
54980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
54990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* coreFrame = core([self _selectedOrMainFrame]);
55000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!coreFrame)
55010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return NO;
55022bde8e466a4451c7319e3a072d118917957d6554Steve Block    return coreFrame->selection()->isAll(CanCrossEditingBoundary);
55030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
55040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
55058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
55068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic WebFrameView *containingFrameView(NSView *view)
55088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
55098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (view && ![view isKindOfClass:[WebFrameView class]])
55108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        view = [view superview];
55118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return (WebFrameView *)view;
55128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
55138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (WebFileInternal)
55158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5516e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic inline uint64_t roundUpToPowerOf2(uint64_t num)
5517e14391e94c850b8bd03680c23b38978db68687a8John Reck{
5518e14391e94c850b8bd03680c23b38978db68687a8John Reck    return powf(2.0, ceilf(log2f(num)));
5519e14391e94c850b8bd03680c23b38978db68687a8John Reck}
5520e14391e94c850b8bd03680c23b38978db68687a8John Reck
55218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)_setCacheModel:(WebCacheModel)cacheModel
55228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
55238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (s_didSetCacheModel && cacheModel == s_cacheModel)
55248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
55258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSString *nsurlCacheDirectory = (NSString *)WebCFAutorelease(WKCopyFoundationCacheDirectory());
55278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!nsurlCacheDirectory)
55288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        nsurlCacheDirectory = NSHomeDirectory();
55298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5530e14391e94c850b8bd03680c23b38978db68687a8John Reck    static uint64_t memSize = roundUpToPowerOf2(WebMemorySize() / 1024 / 1024);
55318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned long long diskFreeSize = WebVolumeFreeSize(nsurlCacheDirectory) / 1024 / 1000;
55328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSURLCache *nsurlCache = [NSURLCache sharedURLCache];
55338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned cacheTotalCapacity = 0;
55358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned cacheMinDeadCapacity = 0;
55368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned cacheMaxDeadCapacity = 0;
55378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double deadDecodedDataDeletionInterval = 0;
55388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned pageCacheCapacity = 0;
55408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSUInteger nsurlCacheMemoryCapacity = 0;
55428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSUInteger nsurlCacheDiskCapacity = 0;
55438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (cacheModel) {
55458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case WebCacheModelDocumentViewer: {
55468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Page cache capacity (in pages)
55478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pageCacheCapacity = 0;
55488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Object cache capacities (in bytes)
5550e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (memSize >= 4096)
5551e14391e94c850b8bd03680c23b38978db68687a8John Reck            cacheTotalCapacity = 128 * 1024 * 1024;
5552e14391e94c850b8bd03680c23b38978db68687a8John Reck        else if (memSize >= 2048)
5553635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            cacheTotalCapacity = 96 * 1024 * 1024;
5554635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        else if (memSize >= 1024)
55558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            cacheTotalCapacity = 32 * 1024 * 1024;
5556635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        else if (memSize >= 512)
5557635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            cacheTotalCapacity = 16 * 1024 * 1024;
55588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cacheMinDeadCapacity = 0;
55608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cacheMaxDeadCapacity = 0;
55618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Foundation memory cache capacity (in bytes)
55638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        nsurlCacheMemoryCapacity = 0;
55648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Foundation disk cache capacity (in bytes)
55668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        nsurlCacheDiskCapacity = [nsurlCache diskCapacity];
55678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
55698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
55708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case WebCacheModelDocumentBrowser: {
55718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Page cache capacity (in pages)
55728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (memSize >= 1024)
55738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            pageCacheCapacity = 3;
55748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (memSize >= 512)
55758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            pageCacheCapacity = 2;
55768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (memSize >= 256)
55778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            pageCacheCapacity = 1;
55788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
55798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            pageCacheCapacity = 0;
55808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Object cache capacities (in bytes)
5582e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (memSize >= 4096)
5583e14391e94c850b8bd03680c23b38978db68687a8John Reck            cacheTotalCapacity = 128 * 1024 * 1024;
5584e14391e94c850b8bd03680c23b38978db68687a8John Reck        else if (memSize >= 2048)
5585635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            cacheTotalCapacity = 96 * 1024 * 1024;
5586635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        else if (memSize >= 1024)
55878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            cacheTotalCapacity = 32 * 1024 * 1024;
5588635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        else if (memSize >= 512)
5589635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            cacheTotalCapacity = 16 * 1024 * 1024;
55908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cacheMinDeadCapacity = cacheTotalCapacity / 8;
55928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cacheMaxDeadCapacity = cacheTotalCapacity / 4;
55938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
55948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Foundation memory cache capacity (in bytes)
55958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (memSize >= 2048)
55968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheMemoryCapacity = 4 * 1024 * 1024;
55978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (memSize >= 1024)
55988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheMemoryCapacity = 2 * 1024 * 1024;
55998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (memSize >= 512)
56008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheMemoryCapacity = 1 * 1024 * 1024;
56018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
56028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheMemoryCapacity =      512 * 1024;
56038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Foundation disk cache capacity (in bytes)
56058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (diskFreeSize >= 16384)
56068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheDiskCapacity = 50 * 1024 * 1024;
56078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (diskFreeSize >= 8192)
56088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheDiskCapacity = 40 * 1024 * 1024;
56098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (diskFreeSize >= 4096)
56108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheDiskCapacity = 30 * 1024 * 1024;
56118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
56128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheDiskCapacity = 20 * 1024 * 1024;
56138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
56158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case WebCacheModelPrimaryWebBrowser: {
56178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Page cache capacity (in pages)
56188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // (Research indicates that value / page drops substantially after 3 pages.)
56198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (memSize >= 2048)
56208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            pageCacheCapacity = 5;
56218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (memSize >= 1024)
56228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            pageCacheCapacity = 4;
56238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (memSize >= 512)
56248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            pageCacheCapacity = 3;
56258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (memSize >= 256)
56268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            pageCacheCapacity = 2;
56278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
56288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            pageCacheCapacity = 1;
56298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Object cache capacities (in bytes)
56318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // (Testing indicates that value / MB depends heavily on content and
56328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // browsing pattern. Even growth above 128MB can have substantial
56338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // value / MB for some content / browsing patterns.)
5634e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (memSize >= 4096)
5635e14391e94c850b8bd03680c23b38978db68687a8John Reck            cacheTotalCapacity = 192 * 1024 * 1024;
5636e14391e94c850b8bd03680c23b38978db68687a8John Reck        else if (memSize >= 2048)
5637635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            cacheTotalCapacity = 128 * 1024 * 1024;
56388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (memSize >= 1024)
56398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            cacheTotalCapacity = 64 * 1024 * 1024;
5640635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        else if (memSize >= 512)
5641635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            cacheTotalCapacity = 32 * 1024 * 1024;
56428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cacheMinDeadCapacity = cacheTotalCapacity / 4;
56448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cacheMaxDeadCapacity = cacheTotalCapacity / 2;
56458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // This code is here to avoid a PLT regression. We can remove it if we
56478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // can prove that the overall system gain would justify the regression.
56488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cacheMaxDeadCapacity = max(24u, cacheMaxDeadCapacity);
56498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        deadDecodedDataDeletionInterval = 60;
56518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Foundation memory cache capacity (in bytes)
56538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // (These values are small because WebCore does most caching itself.)
56548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (memSize >= 1024)
56558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheMemoryCapacity = 4 * 1024 * 1024;
56568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (memSize >= 512)
56578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheMemoryCapacity = 2 * 1024 * 1024;
56588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (memSize >= 256)
56598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheMemoryCapacity = 1 * 1024 * 1024;
56608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
56618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheMemoryCapacity =      512 * 1024;
56628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Foundation disk cache capacity (in bytes)
56648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (diskFreeSize >= 16384)
56658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheDiskCapacity = 175 * 1024 * 1024;
56668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (diskFreeSize >= 8192)
56678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheDiskCapacity = 150 * 1024 * 1024;
56688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (diskFreeSize >= 4096)
56698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheDiskCapacity = 125 * 1024 * 1024;
56708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (diskFreeSize >= 2048)
56718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheDiskCapacity = 100 * 1024 * 1024;
56728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else if (diskFreeSize >= 1024)
56738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheDiskCapacity = 75 * 1024 * 1024;
56748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
56758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            nsurlCacheDiskCapacity = 50 * 1024 * 1024;
56768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
56788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
56798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
56808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT_NOT_REACHED();
56818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
56828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef BUILDING_ON_TIGER
56848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't use a big Foundation disk cache on Tiger because, according to the
56858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // PLT, the Foundation disk cache on Tiger is slower than the network.
56868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    nsurlCacheDiskCapacity = [nsurlCache diskCapacity];
56878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
56888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't shrink a big disk cache, since that would cause churn.
56908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    nsurlCacheDiskCapacity = max(nsurlCacheDiskCapacity, [nsurlCache diskCapacity]);
56918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
569265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    memoryCache()->setCapacities(cacheMinDeadCapacity, cacheMaxDeadCapacity, cacheTotalCapacity);
569365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    memoryCache()->setDeadDecodedDataDeletionInterval(deadDecodedDataDeletionInterval);
56948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    pageCache()->setCapacity(pageCacheCapacity);
56958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [nsurlCache setMemoryCapacity:nsurlCacheMemoryCapacity];
56968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [nsurlCache setDiskCapacity:nsurlCacheDiskCapacity];
56978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s_cacheModel = cacheModel;
56998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    s_didSetCacheModel = YES;
57008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
57018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (WebCacheModel)_cacheModel
57038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return s_cacheModel;
57058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
57068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (WebCacheModel)_didSetCacheModel
57088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return s_didSetCacheModel;
57108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
57118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (WebCacheModel)_maxCacheModelInAnyInstance
57138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCacheModel cacheModel = WebCacheModelDocumentViewer;
57158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSEnumerator *enumerator = [(NSMutableSet *)allWebViewsSet objectEnumerator];
57168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (WebPreferences *preferences = [[enumerator nextObject] preferences])
57178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        cacheModel = max(cacheModel, [preferences cacheModel]);
57188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return cacheModel;
57198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
57208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)_preferencesChangedNotification:(NSNotification *)notification
57228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebPreferences *preferences = (WebPreferences *)[notification object];
57248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT([preferences isKindOfClass:[WebPreferences class]]);
57258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCacheModel cacheModel = [preferences cacheModel];
57278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![self _didSetCacheModel] || cacheModel > [self _cacheModel])
57288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _setCacheModel:cacheModel];
57298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (cacheModel < [self _cacheModel])
57308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _setCacheModel:max([[WebPreferences standardPreferences] cacheModel], [self _maxCacheModelInAnyInstance])];
57318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
57328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)_preferencesRemovedNotification:(NSNotification *)notification
57348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebPreferences *preferences = (WebPreferences *)[notification object];
57368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT([preferences isKindOfClass:[WebPreferences class]]);
57378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([preferences cacheModel] == [self _cacheModel])
57398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _setCacheModel:max([[WebPreferences standardPreferences] cacheModel], [self _maxCacheModelInAnyInstance])];
57408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
57418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebFrame *)_focusedFrame
57438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSResponder *resp = [[self window] firstResponder];
57458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (resp && [resp isKindOfClass:[NSView class]] && [(NSView *)resp isDescendantOf:[[self mainFrame] frameView]]) {
57468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebFrameView *frameView = containingFrameView((NSView *)resp);
57478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(frameView != nil);
57488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [frameView webFrame];
57498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
57508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return nil;
57528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
57538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_isLoading
57558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame *mainFrame = [self mainFrame];
57578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[mainFrame _dataSource] isLoading]
57588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        || [[mainFrame provisionalDataSource] isLoading];
57598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
57608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebFrameView *)_frameViewAtWindowPoint:(NSPoint)point
57628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->closed)
57648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
57650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(_private->usesDocumentViews);
57668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView *view = [self hitTest:[[self superview] convertPoint:point fromView:nil]];
57678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![view isDescendantOf:[[self mainFrame] frameView]])
57688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
57698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrameView *frameView = containingFrameView(view);
57708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(frameView);
57718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return frameView;
57728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
57738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)_preflightSpellCheckerNow:(id)sender
57758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[NSSpellChecker sharedSpellChecker] _preflightChosenSpellServer];
57778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
57788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)_preflightSpellChecker
57808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // As AppKit does, we wish to delay tickling the shared spellchecker into existence on application launch.
57828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([NSSpellChecker sharedSpellCheckerExists]) {
57838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _preflightSpellCheckerNow:self];
57848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
57858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self performSelector:@selector(_preflightSpellCheckerNow:) withObject:self afterDelay:2.0];
57868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
57878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
57888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_continuousCheckingAllowed
57908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
57918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static BOOL allowContinuousSpellChecking = YES;
57928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static BOOL readAllowContinuousSpellCheckingDefault = NO;
57938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!readAllowContinuousSpellCheckingDefault) {
57948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([[NSUserDefaults standardUserDefaults] objectForKey:@"NSAllowContinuousSpellChecking"]) {
57958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            allowContinuousSpellChecking = [[NSUserDefaults standardUserDefaults] boolForKey:@"NSAllowContinuousSpellChecking"];
57968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
57978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        readAllowContinuousSpellCheckingDefault = YES;
57988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
57998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return allowContinuousSpellChecking;
58008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
58018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSResponder *)_responderForResponderOperations
58038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
58048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSResponder *responder = [[self window] firstResponder];
58058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrameView *mainFrameView = [[self mainFrame] frameView];
58068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the current responder is outside of the webview, use our main frameView or its
58088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // document view. We also do this for subviews of self that are siblings of the main
58098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // frameView since clients might insert non-webview-related views there (see 4552713).
58108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (responder != self && ![mainFrameView _web_firstResponderIsSelfOrDescendantView]) {
58118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        responder = [mainFrameView documentView];
58128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!responder)
58138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            responder = mainFrameView;
58148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
58158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return responder;
58168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
58178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_openFrameInNewWindowFromMenu:(NSMenuItem *)sender
58198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
58208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT_ARG(sender, [sender isKindOfClass:[NSMenuItem class]]);
58218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSDictionary *element = [sender representedObject];
58238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT([element isKindOfClass:[NSDictionary class]]);
58248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
582506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    WebDataSource *dataSource = [(WebFrame *)[element objectForKey:WebElementFrameKey] dataSource];
58268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSURLRequest *request = [[dataSource request] copy];
58278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(request);
58288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _openNewWindowWithRequest:request];
58308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [request release];
58318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
58328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_searchWithGoogleFromMenu:(id)sender
58348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
58358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id documentView = [[[self selectedFrame] frameView] documentView];
58368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![documentView conformsToProtocol:@protocol(WebDocumentText)]) {
58378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
58388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
58398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *selectedString = [(id <WebDocumentText>)documentView selectedString];
58418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([selectedString length] == 0) {
58428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
58438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
58448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSPasteboard *pasteboard = [NSPasteboard pasteboardWithUniqueName];
58468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [pasteboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
58478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableString *s = [selectedString mutableCopy];
58488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const unichar nonBreakingSpaceCharacter = 0xA0;
58498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *nonBreakingSpaceString = [NSString stringWithCharacters:&nonBreakingSpaceCharacter length:1];
58508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [s replaceOccurrencesOfString:nonBreakingSpaceString withString:@" " options:0 range:NSMakeRange(0, [s length])];
58518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [pasteboard setString:s forType:NSStringPboardType];
58528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [s release];
58538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: seems fragile to use the service by name, but this is what AppKit does
58558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSPerformService(@"Search With Google", pasteboard);
58568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
58578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
58588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_searchWithSpotlightFromMenu:(id)sender
58598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
58608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id documentView = [[[self selectedFrame] frameView] documentView];
58618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![documentView conformsToProtocol:@protocol(WebDocumentText)])
58628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
5863231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
58648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *selectedString = [(id <WebDocumentText>)documentView selectedString];
5865231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (![selectedString length])
58668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
58678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5868231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
5869231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    [[NSWorkspace sharedWorkspace] showSearchResultsForQueryString:selectedString];
5870231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
58718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    (void)HISearchWindowShow((CFStringRef)selectedString, kNilOptions);
5872231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
58738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
58740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
58750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
58760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_clearLayerSyncLoopObserver
58770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
58780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!_private->layerSyncRunLoopObserver)
58790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
58800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
58810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CFRunLoopObserverInvalidate(_private->layerSyncRunLoopObserver);
58820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CFRelease(_private->layerSyncRunLoopObserver);
58830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _private->layerSyncRunLoopObserver = 0;
58840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
58850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
5886ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
5887a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if ENABLE(GLIB_SUPPORT)
5888ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block- (void)_clearGlibLoopObserver
5889ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
5890ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (!_private->glibRunLoopObserver)
5891ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return;
5892ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
5893ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    CFRunLoopObserverInvalidate(_private->glibRunLoopObserver);
5894ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    CFRelease(_private->glibRunLoopObserver);
5895ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    _private->glibRunLoopObserver = 0;
5896ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
5897ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif
58988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
58998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebView (WebViewInternal)
59018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5902692e5dbf12901edacf14812a6fae25462920af42Steve Block+ (BOOL)shouldIncludeInWebKitStatistics
5903692e5dbf12901edacf14812a6fae25462920af42Steve Block{
5904692e5dbf12901edacf14812a6fae25462920af42Steve Block    return NO;
5905692e5dbf12901edacf14812a6fae25462920af42Steve Block}
5906692e5dbf12901edacf14812a6fae25462920af42Steve Block
59078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_becomingFirstResponderFromOutside
59088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
59098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->becomingFirstResponderFromOutside;
59108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
59118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(ICONDATABASE)
59138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_receivedIconChangedNotification:(NSNotification *)notification
59148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
59158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the URL for this notification
59168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSDictionary *userInfo = [notification userInfo];
59178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT([userInfo isKindOfClass:[NSDictionary class]]);
59188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *urlString = [userInfo objectForKey:WebIconNotificationUserInfoURLKey];
59198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT([urlString isKindOfClass:[NSString class]]);
59208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If that URL matches the current main frame, dispatch the delegate call, which will also unregister
59228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // us for this notification
59238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([[self mainFrameURL] isEqualTo:urlString])
59248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _dispatchDidReceiveIconFromWebFrame:[self mainFrame]];
59258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
59268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_registerForIconNotification:(BOOL)listen
59288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
59298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (listen)
59308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_receivedIconChangedNotification:) name:WebIconDatabaseDidAddIconNotification object:nil];
59318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else
59328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSNotificationCenter defaultCenter] removeObserver:self name:WebIconDatabaseDidAddIconNotification object:nil];
59338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
59348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_dispatchDidReceiveIconFromWebFrame:(WebFrame *)webFrame
59368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
59378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This willChangeValueForKey call is too late, because the icon has already changed by now.
59388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _willChangeValueForKey:_WebMainFrameIconKey];
59398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Since we definitely have an icon and are about to send out the delegate call for that, this WebView doesn't need to listen for the general
59418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // notification any longer
59428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _registerForIconNotification:NO];
59438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrameLoadDelegateImplementationCache* cache = &_private->frameLoadDelegateImplementations;
59458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (cache->didReceiveIconForFrameFunc) {
59462bde8e466a4451c7319e3a072d118917957d6554Steve Block        Image* image = iconDatabase().synchronousIconForPageURL(core(webFrame)->document()->url().string(), IntSize(16, 16));
59478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (NSImage *icon = webGetNSImage(image, NSMakeSize(16, 16)))
59488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CallFrameLoadDelegate(cache->didReceiveIconForFrameFunc, self, @selector(webView:didReceiveIcon:forFrame:), icon, webFrame);
59498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
59508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _didChangeValueForKey:_WebMainFrameIconKey];
59528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
59530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif // ENABLE(ICONDATABASE)
59548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_addObject:(id)object forIdentifier:(unsigned long)identifier
59568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
59578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!_private->identifierMap.contains(identifier));
59588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the identifier map is initially empty it means we're starting a load
59608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // of something. The semantic is that the web view should be around as long
59618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // as something is loading. Because of that we retain the web view.
59628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->identifierMap.isEmpty())
59638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CFRetain(self);
59648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->identifierMap.set(identifier, object);
59668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
59678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_objectForIdentifier:(unsigned long)identifier
59698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
59708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->identifierMap.get(identifier).get();
59718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
59728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_removeObjectForIdentifier:(unsigned long)identifier
59748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
59758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(_private->identifierMap.contains(identifier));
59768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->identifierMap.remove(identifier);
59778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the identifier map is now empty it means we're no longer loading anything
59798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // and we should release the web view.
59808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->identifierMap.isEmpty())
59818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CFRelease(self);
59828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
59838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_retrieveKeyboardUIModeFromPreferences:(NSNotification *)notification
59858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
59868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFPreferencesAppSynchronize(UniversalAccessDomain);
59878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Boolean keyExistsAndHasValidFormat;
59898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int mode = CFPreferencesGetAppIntegerValue(AppleKeyboardUIMode, UniversalAccessDomain, &keyExistsAndHasValidFormat);
59908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The keyboard access mode is reported by two bits:
59928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Bit 0 is set if feature is on
59938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Bit 1 is set if full keyboard access works for any control, not just text boxes and lists
59948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->_keyboardUIMode = (mode & 0x2) ? KeyboardAccessFull : KeyboardAccessDefault;
59958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // check for tabbing to links
59978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([_private->preferences tabsToLinks])
59988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->_keyboardUIMode = (KeyboardUIMode)(_private->_keyboardUIMode | KeyboardAccessTabsToLinks);
59998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
60008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (KeyboardUIMode)_keyboardUIMode
60028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
60038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->_keyboardUIModeAccessed) {
60048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->_keyboardUIModeAccessed = YES;
60058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _retrieveKeyboardUIModeFromPreferences:nil];
60078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSDistributedNotificationCenter defaultCenter]
60098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addObserver:self selector:@selector(_retrieveKeyboardUIModeFromPreferences:)
60108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            name:KeyboardUIModeDidChangeNotification object:nil];
60118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[NSNotificationCenter defaultCenter]
60138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addObserver:self selector:@selector(_retrieveKeyboardUIModeFromPreferences:)
60142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            name:WebPreferencesChangedInternalNotification object:nil];
60158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
60168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->_keyboardUIMode;
60178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
60188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_setInsertionPasteboard:(NSPasteboard *)pasteboard
60208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
60210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _private->insertionPasteboard = pasteboard;
60228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
60238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_selectionChanged
60258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
60260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private->usesDocumentViews) {
60270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        id documentView = [[[self _selectedOrMainFrame] frameView] documentView];
60280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ([documentView isKindOfClass:[WebHTMLView class]])
60290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            [documentView _selectionChanged];
60300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
60318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
60328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // FIXME (Viewless): We'll need code here.
60348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
60358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (Frame*)_mainCoreFrame
60378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
60380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return (_private && _private->page) ? _private->page->mainFrame() : 0;
60398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
60408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6041cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block- (WebFrame *)_selectedOrMainFrame
6042cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
6043cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    WebFrame *result = [self selectedFrame];
6044cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (result == nil)
6045cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        result = [self mainFrame];
6046cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    return result;
6047cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
6048cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
60490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
60508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)_needsOneShotDrawingSynchronization
60528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
60530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return _private->needsOneShotDrawingSynchronization;
60548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
60558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_setNeedsOneShotDrawingSynchronization:(BOOL)needsSynchronization
60578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
60580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _private->needsOneShotDrawingSynchronization = needsSynchronization;
60598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
60608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)_syncCompositingChanges
60628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
60630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Frame* frame = [self _mainCoreFrame];
60640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (frame && frame->view())
6065ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return frame->view()->syncCompositingStateIncludingSubframes();
60668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return YES;
6068635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
6069635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
60700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*
60710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    The order of events with compositing updates is this:
60720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
60730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch   Start of runloop                                        End of runloop
60740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        |                                                       |
60750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch      --|-------------------------------------------------------|--
60760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch           ^         ^                                        ^
60770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch           |         |                                        |
60780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSWindow update, |                                     CA commit
60790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch     NSView drawing  |
60800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        flush        |
60810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                layerSyncRunLoopObserverCallBack
60820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
60830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    To avoid flashing, we have to ensure that compositing changes (rendered via
60840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    the CoreAnimation rendering display link) appear on screen at the same time
60850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    as content painted into the window via the normal WebCore rendering path.
60860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
60870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CoreAnimation will commit any layer changes at the end of the runloop via
60880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    its "CA commit" observer. Those changes can then appear onscreen at any time
60890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    when the display link fires, which can result in unsynchronized rendering.
60900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
60910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    To fix this, the GraphicsLayerCA code in WebCore does not change the CA
60920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    layer tree during style changes and layout; it stores up all changes and
60930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    commits them via syncCompositingState(). There are then two situations in
60940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    which we can call syncCompositingState():
60950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
60960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    1. When painting. FrameView::paintContents() makes a call to syncCompositingState().
60970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
60980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    2. When style changes/layout have made changes to the layer tree which do not
60990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch       result in painting. In this case we need a run loop observer to do a
61000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch       syncCompositingState() at an appropriate time. The observer will keep firing
61010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch       until the time is right (essentially when there are no more pending layouts).
61020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
61030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
6104563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
61050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void layerSyncRunLoopObserverCallBack(CFRunLoopObserverRef, CFRunLoopActivity, void* info)
6106563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
610721939df44de1705786c545cd1bf519d47250322dBen Murdoch    WebView *webView = reinterpret_cast<WebView*>(info);
610821939df44de1705786c545cd1bf519d47250322dBen Murdoch    NSWindow *window = [webView window];
610921939df44de1705786c545cd1bf519d47250322dBen Murdoch
611021939df44de1705786c545cd1bf519d47250322dBen Murdoch    // An NSWindow may not display in the next runloop cycle after dirtying due to delayed window display logic,
611121939df44de1705786c545cd1bf519d47250322dBen Murdoch    // in which case this observer can fire first. So if the window is due for a display, don't commit
611221939df44de1705786c545cd1bf519d47250322dBen Murdoch    // layer changes, otherwise they'll show on screen before the view drawing.
611306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    bool viewsNeedDisplay;
611406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#ifndef __LP64__
611506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (window && [window _wrapsCarbonWindow])
611606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        viewsNeedDisplay = HIViewGetNeedsDisplay(HIViewGetRoot(static_cast<WindowRef>([window windowRef])));
611706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    else
611806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
611906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        viewsNeedDisplay = [window viewsNeedDisplay];
612006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
612106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (viewsNeedDisplay)
612221939df44de1705786c545cd1bf519d47250322dBen Murdoch        return;
612321939df44de1705786c545cd1bf519d47250322dBen Murdoch
612421939df44de1705786c545cd1bf519d47250322dBen Murdoch    if ([webView _syncCompositingChanges]) {
61250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [webView _clearLayerSyncLoopObserver];
612621939df44de1705786c545cd1bf519d47250322dBen Murdoch        // AppKit may have disabled screen updates, thinking an upcoming window flush will re-enable them.
612721939df44de1705786c545cd1bf519d47250322dBen Murdoch        // In case setNeedsDisplayInRect() has prevented the window from needing to be flushed, re-enable screen
612821939df44de1705786c545cd1bf519d47250322dBen Murdoch        // updates here.
612921939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (![window isFlushWindowDisabled])
613021939df44de1705786c545cd1bf519d47250322dBen Murdoch            [window _enableScreenUpdatesIfNeeded];
613121939df44de1705786c545cd1bf519d47250322dBen Murdoch    } else {
613221939df44de1705786c545cd1bf519d47250322dBen Murdoch        // Since the WebView does not need display, -viewWillDraw will not be called. Perform pending layout now,
613321939df44de1705786c545cd1bf519d47250322dBen Murdoch        // so that the layers draw with up-to-date layout.
613421939df44de1705786c545cd1bf519d47250322dBen Murdoch        [webView _viewWillDrawInternal];
613521939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
6136563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
6137563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
61380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_scheduleCompositingLayerSync
6139563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
6140bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    CFRunLoopRef currentRunLoop = CFRunLoopGetCurrent();
6141bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
6142bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // Make sure we wake up the loop or the observer could be delayed until some other source fires.
6143bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    CFRunLoopWakeUp(currentRunLoop);
6144bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
61450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (_private->layerSyncRunLoopObserver)
61460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
6147563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
61480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Run after AppKit does its window update. If we do any painting, we'll commit
61490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // layer changes from FrameView::paintContents(), otherwise we'll commit via
61500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // _syncCompositingChanges when this observer fires.
61510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    const CFIndex runLoopOrder = NSDisplayWindowRunLoopOrdering + 1;
6152563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
61530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // The WebView always outlives the observer, so no need to retain/release.
61540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CFRunLoopObserverContext context = { 0, self, 0, 0, 0 };
61558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
61560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _private->layerSyncRunLoopObserver = CFRunLoopObserverCreate(NULL,
61570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        kCFRunLoopBeforeWaiting | kCFRunLoopExit, true /* repeats */,
61580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        runLoopOrder, layerSyncRunLoopObserverCallBack, &context);
61598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6160bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    CFRunLoopAddObserver(currentRunLoop, _private->layerSyncRunLoopObserver, kCFRunLoopCommonModes);
61618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
61628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
61630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
61648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6165231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(VIDEO)
6166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6167231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block- (void)_enterFullscreenForNode:(WebCore::Node*)node
6168231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
6169231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(node->hasTagName(WebCore::HTMLNames::videoTag));
6170231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    HTMLMediaElement* videoElement = static_cast<HTMLMediaElement*>(node);
6171231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6172231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (_private->fullscreenController) {
6173231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if ([_private->fullscreenController mediaElement] == videoElement) {
6174231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // The backend may just warn us that the underlaying plaftormMovie()
6175231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            // has changed. Just force an update.
6176231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            [_private->fullscreenController setMediaElement:videoElement];
6177231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return; // No more to do.
6178231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
6179231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // First exit Fullscreen for the old mediaElement.
6181231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        [_private->fullscreenController mediaElement]->exitFullscreen();
6182231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // This previous call has to trigger _exitFullscreen,
6183231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // which has to clear _private->fullscreenController.
6184231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ASSERT(!_private->fullscreenController);
6185231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
6186231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!_private->fullscreenController) {
6187231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        _private->fullscreenController = [[WebVideoFullscreenController alloc] init];
6188231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        [_private->fullscreenController setMediaElement:videoElement];
6189231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        [_private->fullscreenController enterFullscreen:[[self window] screen]];
6190231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
6191231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else
6192231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        [_private->fullscreenController setMediaElement:videoElement];
6193231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
6194231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6195231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block- (void)_exitFullscreen
6196231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
6197cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!_private->fullscreenController)
6198cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        return;
6199231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    [_private->fullscreenController exitFullscreen];
6200231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    [_private->fullscreenController release];
6201231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    _private->fullscreenController = nil;
6202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
6203231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
6205231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
6206cad810f21b803229eb11403f9209855525a25d57Steve Block#if ENABLE(FULLSCREEN_API)
62072bde8e466a4451c7319e3a072d118917957d6554Steve Block- (BOOL)_supportsFullScreenForElement:(const WebCore::Element*)element withKeyboard:(BOOL)withKeyboard
6208cad810f21b803229eb11403f9209855525a25d57Steve Block{
62092bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (withKeyboard)
62102bde8e466a4451c7319e3a072d118917957d6554Steve Block        return NO;
62112bde8e466a4451c7319e3a072d118917957d6554Steve Block
6212cad810f21b803229eb11403f9209855525a25d57Steve Block    if (![[WebPreferences standardPreferences] fullScreenEnabled])
6213cad810f21b803229eb11403f9209855525a25d57Steve Block        return NO;
6214cad810f21b803229eb11403f9209855525a25d57Steve Block
6215cad810f21b803229eb11403f9209855525a25d57Steve Block    // FIXME: If the element is in an IFrame, we should ensure it has
6216cad810f21b803229eb11403f9209855525a25d57Steve Block    // an AllowsFullScreen=YES attribute before allowing fullscreen access.
6217cad810f21b803229eb11403f9209855525a25d57Steve Block    return YES;
6218cad810f21b803229eb11403f9209855525a25d57Steve Block}
6219cad810f21b803229eb11403f9209855525a25d57Steve Block
6220cad810f21b803229eb11403f9209855525a25d57Steve Block- (void)_enterFullScreenForElement:(WebCore::Element*)element
6221cad810f21b803229eb11403f9209855525a25d57Steve Block{
6222cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!_private->newFullscreenController)
6223cad810f21b803229eb11403f9209855525a25d57Steve Block        _private->newFullscreenController = [[WebFullScreenController alloc] init];
6224cad810f21b803229eb11403f9209855525a25d57Steve Block
6225cad810f21b803229eb11403f9209855525a25d57Steve Block    [_private->newFullscreenController setElement:element];
6226cad810f21b803229eb11403f9209855525a25d57Steve Block    [_private->newFullscreenController setWebView:self];
6227cad810f21b803229eb11403f9209855525a25d57Steve Block    [_private->newFullscreenController enterFullscreen:[[self window] screen]];
6228cad810f21b803229eb11403f9209855525a25d57Steve Block}
6229cad810f21b803229eb11403f9209855525a25d57Steve Block
6230cad810f21b803229eb11403f9209855525a25d57Steve Block- (void)_exitFullScreenForElement:(WebCore::Element*)element
6231cad810f21b803229eb11403f9209855525a25d57Steve Block{
6232cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!_private->newFullscreenController)
6233cad810f21b803229eb11403f9209855525a25d57Steve Block        return;
6234cad810f21b803229eb11403f9209855525a25d57Steve Block    [_private->newFullscreenController exitFullscreen];
6235cad810f21b803229eb11403f9209855525a25d57Steve Block}
6236cad810f21b803229eb11403f9209855525a25d57Steve Block
6237cad810f21b803229eb11403f9209855525a25d57Steve Block- (void)_fullScreenRendererChanged:(WebCore::RenderBox*)renderer
6238cad810f21b803229eb11403f9209855525a25d57Steve Block{
6239cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!_private->newFullscreenController)
6240cad810f21b803229eb11403f9209855525a25d57Steve Block        _private->newFullscreenController = [[WebFullScreenController alloc] init];
6241cad810f21b803229eb11403f9209855525a25d57Steve Block    [_private->newFullscreenController setRenderer:renderer];
6242cad810f21b803229eb11403f9209855525a25d57Steve Block}
6243cad810f21b803229eb11403f9209855525a25d57Steve Block#endif
6244cad810f21b803229eb11403f9209855525a25d57Steve Block
6245a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if ENABLE(GLIB_SUPPORT)
6246ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
6247ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockstatic void glibContextIterationCallback(CFRunLoopObserverRef, CFRunLoopActivity, void*)
6248ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
6249ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    g_main_context_iteration(0, FALSE);
6250ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
6251ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
6252ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block- (void)_scheduleGlibContextIterations
6253ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
6254ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (_private->glibRunLoopObserver)
6255ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return;
6256ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
6257ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    NSRunLoop* myRunLoop = [NSRunLoop currentRunLoop];
6258ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
6259ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Create a run loop observer and attach it to the run loop.
6260ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    CFRunLoopObserverContext context = {0, self, 0, 0, 0};
6261ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    _private->glibRunLoopObserver = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopBeforeWaiting, YES, 0, &glibContextIterationCallback, &context);
6262ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
6263ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (_private->glibRunLoopObserver) {
6264ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        CFRunLoopRef cfLoop = [myRunLoop getCFRunLoop];
6265ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        CFRunLoopAddObserver(cfLoop, _private->glibRunLoopObserver, kCFRunLoopDefaultMode);
6266ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
6267ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
6268ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
6269ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif
6270ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
6271ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
62728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
6273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
62745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick@implementation WebView (WebViewDeviceOrientation)
62755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
62765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick- (void)_setDeviceOrientationProvider:(id<WebDeviceOrientationProvider>)deviceOrientationProvider
62775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
62785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (_private)
62795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        _private->m_deviceOrientationProvider = deviceOrientationProvider;
62805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
62815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
62825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick- (id<WebDeviceOrientationProvider>)_deviceOrientationProvider
62835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
62845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    if (_private)
62855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        return _private->m_deviceOrientationProvider;
62865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return nil;
62875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
62885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
62895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick@end
62905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
6291d0825bca7fe65beaee391d30da42e937db621564Steve Block@implementation WebView (WebViewGeolocation)
6292d0825bca7fe65beaee391d30da42e937db621564Steve Block
6293d0825bca7fe65beaee391d30da42e937db621564Steve Block- (void)_setGeolocationProvider:(id<WebGeolocationProvider>)geolocationProvider
6294d0825bca7fe65beaee391d30da42e937db621564Steve Block{
6295d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (_private)
6296d0825bca7fe65beaee391d30da42e937db621564Steve Block        _private->_geolocationProvider = geolocationProvider;
6297d0825bca7fe65beaee391d30da42e937db621564Steve Block}
6298d0825bca7fe65beaee391d30da42e937db621564Steve Block
6299d0825bca7fe65beaee391d30da42e937db621564Steve Block- (id<WebGeolocationProvider>)_geolocationProvider
6300d0825bca7fe65beaee391d30da42e937db621564Steve Block{
6301d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (_private)
6302d0825bca7fe65beaee391d30da42e937db621564Steve Block        return _private->_geolocationProvider;
6303d0825bca7fe65beaee391d30da42e937db621564Steve Block    return nil;
6304d0825bca7fe65beaee391d30da42e937db621564Steve Block}
6305d0825bca7fe65beaee391d30da42e937db621564Steve Block
630606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen- (void)_geolocationDidChangePosition:(WebGeolocationPosition *)position
6307d0825bca7fe65beaee391d30da42e937db621564Steve Block{
6308d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(CLIENT_BASED_GEOLOCATION)
6309d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (_private && _private->page)
6310d0825bca7fe65beaee391d30da42e937db621564Steve Block        _private->page->geolocationController()->positionChanged(core(position));
6311d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
6312d0825bca7fe65beaee391d30da42e937db621564Steve Block}
6313d0825bca7fe65beaee391d30da42e937db621564Steve Block
6314d0825bca7fe65beaee391d30da42e937db621564Steve Block- (void)_geolocationDidFailWithError:(NSError *)error
6315d0825bca7fe65beaee391d30da42e937db621564Steve Block{
6316d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(CLIENT_BASED_GEOLOCATION)
6317d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (_private && _private->page) {
6318d0825bca7fe65beaee391d30da42e937db621564Steve Block        RefPtr<GeolocationError> geolocatioError = GeolocationError::create(GeolocationError::PositionUnavailable, [error localizedDescription]);
6319d0825bca7fe65beaee391d30da42e937db621564Steve Block        _private->page->geolocationController()->errorOccurred(geolocatioError.get());
6320d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
6321d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
6322d0825bca7fe65beaee391d30da42e937db621564Steve Block}
6323d0825bca7fe65beaee391d30da42e937db621564Steve Block
6324d0825bca7fe65beaee391d30da42e937db621564Steve Block@end
6325d0825bca7fe65beaee391d30da42e937db621564Steve Block
6326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@implementation WebView (WebViewPrivateStyleInfo)
6327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (JSValueRef)_computedStyleIncludingVisitedInfo:(JSContextRef)context forElement:(JSValueRef)value
6329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
6330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    JSLock lock(SilenceAssertionsOnly);
6331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ExecState* exec = toJS(context);
6332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!value)
6333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return JSValueMakeUndefined(context);
6334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    JSValue jsValue = toJS(exec, value);
6335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!jsValue.inherits(&JSElement::s_info))
6336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return JSValueMakeUndefined(context);
6337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    JSElement* jsElement = static_cast<JSElement*>(asObject(jsValue));
6338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Element* element = jsElement->impl();
6339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<CSSComputedStyleDeclaration> style = computedStyle(element, true);
6340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return toRef(exec, toJS(exec, jsElement->globalObject(), style.get()));
6341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
6342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@end
6344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
6345bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen@implementation WebView (WebViewPrivateNodesFromRect)
6346bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
6347bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen- (JSValueRef)_nodesFromRect:(JSContextRef)context forDocument:(JSValueRef)value x:(int)x  y:(int)y top:(unsigned)top right:(unsigned)right bottom:(unsigned)bottom left:(unsigned)left ignoreClipping:(BOOL)ignoreClipping
6348bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
6349bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    JSLock lock(SilenceAssertionsOnly);
6350bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    ExecState* exec = toJS(context);
6351bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!value)
6352bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return JSValueMakeUndefined(context);
6353bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    JSValue jsValue = toJS(exec, value);
6354bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!jsValue.inherits(&JSDocument::s_info))
6355bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return JSValueMakeUndefined(context);
6356bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    JSDocument* jsDocument = static_cast<JSDocument*>(asObject(jsValue));
6357bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    Document* document = jsDocument->impl();
6358bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    RefPtr<NodeList> nodes = document->nodesFromRect(x, y, top, right, bottom, left, ignoreClipping);
6359bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return toRef(exec, toJS(exec, jsDocument->globalObject(), nodes.get()));
6360bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
6361bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
6362bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen@end
6363bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
6364635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef BUILDING_ON_LEOPARD
6365635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6366635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic IMP originalRecursivelyRemoveMailAttributesImp;
6367635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6368635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic id objectElementDataAttribute(DOMHTMLObjectElement *self, SEL)
6369635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
6370635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return [self getAttribute:@"data"];
6371635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
6372635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6373635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void recursivelyRemoveMailAttributes(DOMNode *self, SEL selector, BOOL a, BOOL b, BOOL c)
6374635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
6375635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // While inside this Mail function, change the behavior of -[DOMHTMLObjectElement data] back to what it used to be
6376635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // before we fixed a bug in it (see http://trac.webkit.org/changeset/30044 for that change).
6377635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6378635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // It's a little bit strange to patch a method defined by WebKit, but it helps keep this workaround self-contained.
6379635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6380635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Method methodToPatch = class_getInstanceMethod(objc_getRequiredClass("DOMHTMLObjectElement"), @selector(data));
6381635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IMP originalDataImp = method_setImplementation(methodToPatch, reinterpret_cast<IMP>(objectElementDataAttribute));
6382635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    originalRecursivelyRemoveMailAttributesImp(self, selector, a, b, c);
6383635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    method_setImplementation(methodToPatch, originalDataImp);
6384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
6385635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6386635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
6387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
6388635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void patchMailRemoveAttributesMethod()
6389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
6390635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef BUILDING_ON_LEOPARD
6391635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!WKAppVersionCheckLessThan(@"com.apple.mail", -1, 4.0))
6392635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
6393635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Method methodToPatch = class_getInstanceMethod(objc_getRequiredClass("DOMNode"), @selector(recursivelyRemoveMailAttributes:convertObjectsToImages:convertEditableElements:));
6394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!methodToPatch)
6395635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
6396635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    originalRecursivelyRemoveMailAttributesImp = method_setImplementation(methodToPatch, reinterpret_cast<IMP>(recursivelyRemoveMailAttributes));
6397635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
6398635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
6399