18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(NETSCAPE_PLUGIN_API) 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebBaseNetscapePluginView.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "WebFrameInternal.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitLogging.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitNSStringExtras.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitSystemInterface.h" 370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebPluginContainerCheck.h" 380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebNetscapeContainerCheckContextInfo.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSURLExtras.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSURLRequestExtras.h" 41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "WebView.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebViewInternal.h" 43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/AuthenticationMac.h> 45cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#import <WebCore/BitmapImage.h> 46231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <WebCore/Credential.h> 47231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <WebCore/CredentialStorage.h> 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Document.h> 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Element.h> 50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <WebCore/Frame.h> 51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <WebCore/FrameLoader.h> 52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/HTMLPlugInElement.h> 53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <WebCore/HaltablePlugin.h> 54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <WebCore/Page.h> 55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <WebCore/ProtectionSpace.h> 56563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/RenderView.h> 57cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#import <WebCore/RenderWidget.h> 5821939df44de1705786c545cd1bf519d47250322dBen Murdoch#import <WebCore/WebCoreObjCExtras.h> 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/DOMPrivate.h> 60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <runtime/InitializeThreading.h> 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/Assertions.h> 6221939df44de1705786c545cd1bf519d47250322dBen Murdoch#import <wtf/Threading.h> 63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <wtf/text/CString.h> 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LoginWindowDidSwitchFromUserNotification @"WebLoginWindowDidSwitchFromUserNotification" 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LoginWindowDidSwitchToUserNotification @"WebLoginWindowDidSwitchToUserNotification" 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 68643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic const NSTimeInterval ClearSubstituteImageDelay = 0.5; 69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing namespace WebCore; 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockclass WebHaltablePlugin : public HaltablePlugin { 73231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockpublic: 74231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block WebHaltablePlugin(WebBaseNetscapePluginView* view) 75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block : m_view(view) 76231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block { 77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprivate: 80cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block virtual void halt(); 81cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block virtual void restart(); 82cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block virtual Node* node() const; 83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block virtual bool isWindowed() const; 84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block virtual String pluginName() const; 85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block WebBaseNetscapePluginView* m_view; 87231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}; 88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 89cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid WebHaltablePlugin::halt() 90cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 91cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block [m_view halt]; 92cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 93cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 94cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid WebHaltablePlugin::restart() 95cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 96cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block [m_view resumeFromHalt]; 97cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 98cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 99cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockNode* WebHaltablePlugin::node() const 100cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 101cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return [m_view element]; 102cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 103cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 104643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebHaltablePlugin::isWindowed() const 105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return false; 107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 109643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockString WebHaltablePlugin::pluginName() const 110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 11106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return [[m_view pluginPackage] pluginInfo].name; 112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebBaseNetscapePluginView 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)initialize 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JSC::initializeThreading(); 11921939df44de1705786c545cd1bf519d47250322dBen Murdoch WTF::initializeMainThreadToProcessMainThread(); 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCoreObjCFinalizeOnMainThread(self); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WKSendUserChangeNotifications(); 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (id)initWithFrame:(NSRect)frame 127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project pluginPackage:(WebNetscapePluginPackage *)pluginPackage 128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project URL:(NSURL *)URL 129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project baseURL:(NSURL *)baseURL 130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project MIMEType:(NSString *)MIME 131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project attributeKeys:(NSArray *)keys 132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project attributeValues:(NSArray *)values 133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadManually:(BOOL)loadManually 134563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark element:(PassRefPtr<WebCore::HTMLPlugInElement>)element 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project self = [super initWithFrame:frame]; 137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!self) 138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return nil; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _pluginPackage = pluginPackage; 141563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark _element = element; 142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _sourceURL.adoptNS([URL copy]); 143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _baseURL.adoptNS([baseURL copy]); 144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _MIMEType.adoptNS([MIME copy]); 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Enable "kiosk mode" when instantiating the QT plug-in inside of Dashboard. See <rdar://problem/6878105> 1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if ([[[NSBundle mainBundle] bundleIdentifier] isEqualToString:@"com.apple.dashboard.client"] && 14906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen [_pluginPackage.get() bundleIdentifier] == "com.apple.QuickTime Plugin.plugin") { 1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RetainPtr<NSMutableArray> mutableKeys(AdoptNS, [keys mutableCopy]); 1510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RetainPtr<NSMutableArray> mutableValues(AdoptNS, [values mutableCopy]); 1520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [mutableKeys.get() addObject:@"kioskmode"]; 1540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [mutableValues.get() addObject:@"true"]; 1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [self setAttributeKeys:mutableKeys.get() andValues:mutableValues.get()]; 1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } else 1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [self setAttributeKeys:keys andValues:values]; 1590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 160635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (loadManually) 161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _mode = NP_FULL; 162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _mode = NP_EMBED; 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _loadManually = loadManually; 166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block _haltable = new WebHaltablePlugin(self); 167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return self; 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)dealloc 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(!_isStarted); 173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 174635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [super dealloc]; 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)finalize 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_MAIN_THREAD(); 180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(!_isStarted); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 182635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [super finalize]; 183635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (WebNetscapePluginPackage *)pluginPackage 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return _pluginPackage.get(); 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (BOOL)isFlipped 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return YES; 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (NSURL *)URLWithCString:(const char *)URLCString 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 197635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!URLCString) 198635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return nil; 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 200635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CFStringRef string = CFStringCreateWithCString(kCFAllocatorDefault, URLCString, kCFStringEncodingISOLatin1); 201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(string); // All strings should be representable in ISO Latin 1 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NSString *URLString = [(NSString *)string _web_stringByStrippingReturnCharacters]; 204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NSURL *URL = [NSURL _web_URLWithDataAsString:URLString relativeToURL:_baseURL.get()]; 205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CFRelease(string); 206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!URL) 207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return nil; 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return URL; 2100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (NSMutableURLRequest *)requestWithURLCString:(const char *)URLCString 2130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch NSURL *URL = [self URLWithCString:URLCString]; 2150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!URL) 2160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return nil; 2170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; 219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Frame* frame = core([self webFrame]); 220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!frame) 221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return nil; 222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [request _web_setHTTPReferrer:frame->loader()->outgoingReferrer()]; 223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return request; 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// Methods that subclasses must override 227635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)setAttributeKeys:(NSArray *)keys andValues:(NSArray *)values 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)handleMouseMoved:(NSEvent *)event 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 234635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 237692e5dbf12901edacf14812a6fae25462920af42Steve Block- (void)handleMouseEntered:(NSEvent *)event 238692e5dbf12901edacf14812a6fae25462920af42Steve Block{ 239692e5dbf12901edacf14812a6fae25462920af42Steve Block ASSERT_NOT_REACHED(); 240692e5dbf12901edacf14812a6fae25462920af42Steve Block} 241692e5dbf12901edacf14812a6fae25462920af42Steve Block 242692e5dbf12901edacf14812a6fae25462920af42Steve Block- (void)handleMouseExited:(NSEvent *)event 243692e5dbf12901edacf14812a6fae25462920af42Steve Block{ 244692e5dbf12901edacf14812a6fae25462920af42Steve Block ASSERT_NOT_REACHED(); 245692e5dbf12901edacf14812a6fae25462920af42Steve Block} 246692e5dbf12901edacf14812a6fae25462920af42Steve Block 247635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)focusChanged 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 249635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)windowFocusChanged:(BOOL)hasFocus 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 254635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 257635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (BOOL)createPlugin 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 259635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return NO; 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)loadStream 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 265635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (BOOL)shouldStop 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return YES; 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)destroyPlugin 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)updateAndSetWindow 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)sendModifierEventWithKeyCode:(int)keyCode character:(char)character 2850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT_NOT_REACHED(); 2870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 289cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block- (void)privateBrowsingModeDidChange 290cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 291cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 292cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)removeTrackingRect 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (_trackingTag) { 296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self removeTrackingRect:_trackingTag]; 297635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _trackingTag = 0; 298635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 299635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Do the following after setting trackingTag to 0 so we don't re-enter. 300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 301635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Balance the retain in resetTrackingRect. Use autorelease in case we hold 302635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // the last reference to the window during tear-down, to avoid crashing AppKit. 303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [[self window] autorelease]; 304635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 307635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)resetTrackingRect 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self removeTrackingRect]; 310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (_isStarted) { 311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Retain the window so that removeTrackingRect can work after the window is closed. 312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [[self window] retain]; 313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _trackingTag = [self addTrackingRect:[self bounds] owner:self userData:nil assumeInside:NO]; 314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)stopTimers 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 319635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _shouldFireTimers = NO; 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 322635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)startTimers 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 324635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _shouldFireTimers = YES; 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 327635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)restartTimers 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 329635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self stopTimers]; 330635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 331635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!_isStarted || [[self window] isMiniaturized]) 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 333635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 334635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self startTimers]; 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 337563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (NSRect)_windowClipRect 338563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 339563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark RenderObject* renderer = _element->renderer(); 340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!renderer || !renderer->view()) 341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return NSZeroRect; 342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return toRenderWidget(renderer)->windowClipRect(); 344563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 345563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 346635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (NSRect)visibleRect 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // WebCore may impose an additional clip (via CSS overflow or clip properties). Fetch 349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // that clip now. 350563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return NSIntersectionRect([self convertRect:[self _windowClipRect] fromView:nil], [super visibleRect]); 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)visibleRectDidChange 354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block [self renewGState]; 356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (BOOL)acceptsFirstResponder 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return YES; 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)sendActivateEvent:(BOOL)activate 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 365635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!_isStarted) 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self windowFocusChanged:activate]; 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 371635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)setHasFocus:(BOOL)flag 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 373635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!_isStarted) 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 376635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (_hasFocus == flag) 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 378635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 379635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _hasFocus = flag; 380635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 381635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self focusChanged]; 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)addWindowObservers 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT([self window]); 387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSWindow *theWindow = [self window]; 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter addObserver:self selector:@selector(windowWillClose:) 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project name:NSWindowWillCloseNotification object:theWindow]; 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter addObserver:self selector:@selector(windowBecameKey:) 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project name:NSWindowDidBecomeKeyNotification object:theWindow]; 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter addObserver:self selector:@selector(windowResignedKey:) 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project name:NSWindowDidResignKeyNotification object:theWindow]; 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter addObserver:self selector:@selector(windowDidMiniaturize:) 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project name:NSWindowDidMiniaturizeNotification object:theWindow]; 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter addObserver:self selector:@selector(windowDidDeminiaturize:) 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project name:NSWindowDidDeminiaturizeNotification object:theWindow]; 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter addObserver:self selector:@selector(loginWindowDidSwitchFromUser:) 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project name:LoginWindowDidSwitchFromUserNotification object:nil]; 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter addObserver:self selector:@selector(loginWindowDidSwitchToUser:) 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project name:LoginWindowDidSwitchToUserNotification object:nil]; 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)removeWindowObservers 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter removeObserver:self name:NSWindowWillCloseNotification object:nil]; 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter removeObserver:self name:NSWindowDidBecomeKeyNotification object:nil]; 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter removeObserver:self name:NSWindowDidResignKeyNotification object:nil]; 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter removeObserver:self name:NSWindowDidMiniaturizeNotification object:nil]; 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter removeObserver:self name:NSWindowDidDeminiaturizeNotification object:nil]; 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter removeObserver:self name:LoginWindowDidSwitchFromUserNotification object:nil]; 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [notificationCenter removeObserver:self name:LoginWindowDidSwitchToUserNotification object:nil]; 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 420635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)start 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT([self currentWindow]); 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 424635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (_isStarted) 425635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (_triedAndFailedToCreatePlugin) 4280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 4290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT([self webView]); 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (![[[self webView] preferences] arePlugInsEnabled]) 433635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 434635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 435635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Frame* frame = core([self webFrame]); 436635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!frame) 437635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 438635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Page* page = frame->page(); 439635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!page) 440635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 442635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool wasDeferring = page->defersLoading(); 443635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!wasDeferring) 444635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project page->setDefersLoading(true); 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 446635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project BOOL result = [self createPlugin]; 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 448635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!wasDeferring) 449635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project page->setDefersLoading(false); 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!result) { 4520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch _triedAndFailedToCreatePlugin = YES; 453635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 4540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 456635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _isStarted = YES; 457231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block page->didStartPlugin(_haltable.get()); 458231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 459635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [[self webView] addPluginInstanceView:self]; 460231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 461231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if ([self currentWindow]) 462231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block [self updateAndSetWindow]; 463231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([self window]) { 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self addWindowObservers]; 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([[self window] isKeyWindow]) { 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self sendActivateEvent:YES]; 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self restartTimers]; 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 472635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self resetTrackingRect]; 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 474635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self loadStream]; 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)stop 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 479635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (![self shouldStop]) 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self removeTrackingRect]; 483635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 484635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!_isStarted) 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 486231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 487231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (Frame* frame = core([self webFrame])) { 488231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (Page* page = frame->page()) 489231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block page->didStopPlugin(_haltable.get()); 490231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 492635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _isStarted = NO; 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[self webView] removePluginInstanceView:self]; 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Stop the timers 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self stopTimers]; 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Stop notifications and callbacks. 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self removeWindowObservers]; 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 502635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self destroyPlugin]; 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 505cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block- (void)halt 506cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 507cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT(!_isHalted); 508cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT(_isStarted); 509cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block Element *element = [self element]; 510cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 511e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block CGImageRef cgImage = CGImageRetain([core([self webFrame])->nodeImage(element).get() CGImageForProposedRect:nil context:nil hints:nil]); 512cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#else 513e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block RetainPtr<CGImageSourceRef> imageRef(AdoptCF, CGImageSourceCreateWithData((CFDataRef)[core([self webFrame])->nodeImage(element).get() TIFFRepresentation], 0)); 514cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block CGImageRef cgImage = CGImageSourceCreateImageAtIndex(imageRef.get(), 0, 0); 515cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#endif 516cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT(cgImage); 517cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 518cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block // BitmapImage will release the passed in CGImage on destruction. 519cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block RefPtr<Image> nodeImage = BitmapImage::create(cgImage); 520cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT(element->renderer()); 521cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block toRenderWidget(element->renderer())->showSubstituteImage(nodeImage); 522cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block [self stop]; 523cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block _isHalted = YES; 524cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block _hasBeenHalted = YES; 525cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 526cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 527643ca7872b450ea4efacab6188849e5aac2ba161Steve Block- (void)_clearSubstituteImage 528643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 529643ca7872b450ea4efacab6188849e5aac2ba161Steve Block Element* element = [self element]; 530643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!element) 531643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 532643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 533643ca7872b450ea4efacab6188849e5aac2ba161Steve Block RenderObject* renderer = element->renderer(); 534643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!renderer) 535643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 536643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 537643ca7872b450ea4efacab6188849e5aac2ba161Steve Block toRenderWidget(renderer)->showSubstituteImage(0); 538643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 539643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 540cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block- (void)resumeFromHalt 541cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 542cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT(_isHalted); 543cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT(!_isStarted); 544cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block [self start]; 545cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 546cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (_isStarted) 547cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block _isHalted = NO; 548cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 549cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT([self element]->renderer()); 550643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME 7417484: This is a workaround for plug-ins not drawing immediately. We'd like to detect when the 551643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // plug-in actually draws instead of just assuming it will do so within 0.5 seconds of being restarted. 552643ca7872b450ea4efacab6188849e5aac2ba161Steve Block [self performSelector:@selector(_clearSubstituteImage) withObject:nil afterDelay:ClearSubstituteImageDelay]; 553cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 554cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 555cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block- (BOOL)isHalted 556cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 557cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return _isHalted; 558cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 559cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 5608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block- (BOOL)shouldClipOutPlugin 5618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{ 5628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block NSWindow *window = [self window]; 563692e5dbf12901edacf14812a6fae25462920af42Steve Block return !window || [window isMiniaturized] || [NSApp isHidden] || ![self isDescendantOf:[[self window] contentView]] || [self isHiddenOrHasHiddenAncestor]; 5648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block} 565dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 566dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (BOOL)inFlatteningPaint 567dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 568dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RenderObject* renderer = _element->renderer(); 569dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (renderer && renderer->view()) { 570dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (FrameView* frameView = renderer->view()->frameView()) 571dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return frameView->paintBehavior() & PaintBehaviorFlattenCompositingLayers; 572dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 573dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 574dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return NO; 575dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 576dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 577dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (BOOL)supportsSnapshotting 578dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 57906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return [_pluginPackage.get() supportsSnapshotting]; 580dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 581dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 582f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (void)cacheSnapshot 583f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 584f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch NSImage *snapshot = [[NSImage alloc] initWithSize: [self bounds].size]; 585f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch _snapshotting = YES; 586f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch [snapshot lockFocus]; 587f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch [self drawRect:[self bounds]]; 588f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch [snapshot unlockFocus]; 589f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch _snapshotting = NO; 590f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 591f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch _cachedSnapshot.adoptNS(snapshot); 592f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 593f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 594f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch- (void)clearCachedSnapshot 595f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 596f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch _cachedSnapshot.clear(); 597f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 598f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 599cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block- (BOOL)hasBeenHalted 600cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 601cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return _hasBeenHalted; 602cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 603cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 604635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)viewWillMoveToWindow:(NSWindow *)newWindow 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 606635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // We must remove the tracking rect before we move to the new window. 607635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Once we move to the new window, it will be too late. 608635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self removeTrackingRect]; 609635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self removeWindowObservers]; 610635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 611635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Workaround for: <rdar://problem/3822871> resignFirstResponder is not sent to first responder view when it is removed from the window 612635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self setHasFocus:NO]; 613635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 614635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!newWindow) { 615635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if ([[self webView] hostWindow]) { 616635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // View will be moved out of the actual window but it still has a host window. 617635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self stopTimers]; 618635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } else { 619635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // View will have no associated windows. 620635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self stop]; 621635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 6222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Stop observing WebPreferencesChangedInternalNotification -- we only need to observe this when installed in the view hierarchy. 623635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // When not in the view hierarchy, -viewWillMoveToWindow: and -viewDidMoveToWindow will start/stop the plugin as needed. 6242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [[NSNotificationCenter defaultCenter] removeObserver:self name:WebPreferencesChangedInternalNotification object:nil]; 625635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 626635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 629635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)viewWillMoveToSuperview:(NSView *)newSuperview 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 631635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!newSuperview) { 632635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Stop the plug-in when it is removed from its superview. It is not sufficient to do this in -viewWillMoveToWindow:nil, because 633635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // the WebView might still has a hostWindow at that point, which prevents the plug-in from being destroyed. 634635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // There is no need to start the plug-in when moving into a superview. -viewDidMoveToWindow takes care of that. 635635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self stop]; 636635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 6372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Stop observing WebPreferencesChangedInternalNotification -- we only need to observe this when installed in the view hierarchy. 638635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // When not in the view hierarchy, -viewWillMoveToWindow: and -viewDidMoveToWindow will start/stop the plugin as needed. 6392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [[NSNotificationCenter defaultCenter] removeObserver:self name:WebPreferencesChangedInternalNotification object:nil]; 640635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 643635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)viewDidMoveToWindow 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 645635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self resetTrackingRect]; 646635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 647635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if ([self window]) { 6482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // While in the view hierarchy, observe WebPreferencesChangedInternalNotification so that we can start/stop depending 649635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // on whether plugins are enabled. 650635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [[NSNotificationCenter defaultCenter] addObserver:self 651635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project selector:@selector(preferencesHaveChanged:) 6522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch name:WebPreferencesChangedInternalNotification 653635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project object:nil]; 654231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 655cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block _isPrivateBrowsingEnabled = [[[self webView] preferences] privateBrowsingEnabled]; 656cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 657635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // View moved to an actual window. Start it if not already started. 658635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self start]; 659231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 660231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Starting the plug-in can result in it removing itself from the window so we need to ensure that we're still in 661231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // place before doing anything that requires a window. 662231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if ([self window]) { 663231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block [self restartTimers]; 664231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block [self addWindowObservers]; 665231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 666635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } else if ([[self webView] hostWindow]) { 667635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // View moved out of an actual window, but still has a host window. 668635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Call setWindow to explicitly "clip out" the plug-in from sight. 669635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: It would be nice to do this where we call stopNullEvents in viewWillMoveToWindow. 670635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self updateAndSetWindow]; 671635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 674635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)viewWillMoveToHostWindow:(NSWindow *)hostWindow 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 676635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!hostWindow && ![self window]) { 677635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // View will have no associated windows. 678635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self stop]; 679635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 6802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Remove WebPreferencesChangedInternalNotification observer -- we will observe once again when we move back into the window 6812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [[NSNotificationCenter defaultCenter] removeObserver:self name:WebPreferencesChangedInternalNotification object:nil]; 682635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 685635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)viewDidMoveToHostWindow 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 687635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if ([[self webView] hostWindow]) { 688635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // View now has an associated window. Start it if not already started. 689635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self start]; 690635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 693cad810f21b803229eb11403f9209855525a25d57Steve Block// MARK: NOTIFICATIONS 694635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 695635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)windowWillClose:(NSNotification *)notification 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 697635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self stop]; 698635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 700635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)windowBecameKey:(NSNotification *)notification 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 702635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self sendActivateEvent:YES]; 7030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [self invalidatePluginContentRect:[self bounds]]; 704635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self restartTimers]; 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 707635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)windowResignedKey:(NSNotification *)notification 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 709635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self sendActivateEvent:NO]; 7100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [self invalidatePluginContentRect:[self bounds]]; 711635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self restartTimers]; 7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 714635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)windowDidMiniaturize:(NSNotification *)notification 7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 716635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self stopTimers]; 7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 719635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)windowDidDeminiaturize:(NSNotification *)notification 7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 721635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self restartTimers]; 7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 724635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)loginWindowDidSwitchFromUser:(NSNotification *)notification 7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 726635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self stopTimers]; 7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 729635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project-(void)loginWindowDidSwitchToUser:(NSNotification *)notification 7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 731635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self restartTimers]; 7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 734635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)preferencesHaveChanged:(NSNotification *)notification 7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 736635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project WebPreferences *preferences = [[self webView] preferences]; 737cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 738cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if ([notification object] != preferences) 739cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return; 7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 741cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block BOOL arePlugInsEnabled = [preferences arePlugInsEnabled]; 742cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (_isStarted != arePlugInsEnabled) { 743635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (arePlugInsEnabled) { 744635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if ([self currentWindow]) { 745635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self start]; 746635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 747635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } else { 748635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self stop]; 7490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [self invalidatePluginContentRect:[self bounds]]; 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 752cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 753cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block BOOL isPrivateBrowsingEnabled = [preferences privateBrowsingEnabled]; 754cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (isPrivateBrowsingEnabled != _isPrivateBrowsingEnabled) { 755cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block _isPrivateBrowsingEnabled = isPrivateBrowsingEnabled; 756cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block [self privateBrowsingModeDidChange]; 757cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)renewGState 7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super renewGState]; 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // -renewGState is called whenever the view's geometry changes. It's a little hacky to override this method, but 7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // much safer than walking up the view hierarchy and observing frame/bounds changed notifications, since you don't 7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // have to track subsequent changes to the view hierarchy and add/remove notification observers. 7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // NSOpenGLView uses the exact same technique to reshape its OpenGL surface. 7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 769635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // All of the work this method does may safely be skipped if the view is not in a window. When the view 770635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // is moved back into a window, everything should be set up correctly. 771635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (![self window]) 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 774635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self updateAndSetWindow]; 775635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self resetTrackingRect]; 7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Check to see if the plugin view is completely obscured (scrolled out of view, for example). 779635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // For performance reasons, we send null events at a lower rate to plugins which are obscured. 780635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project BOOL oldIsObscured = _isCompletelyObscured; 781635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project _isCompletelyObscured = NSIsEmptyRect([self visibleRect]); 782635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (_isCompletelyObscured != oldIsObscured) 7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self restartTimers]; 7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 786635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (BOOL)becomeFirstResponder 7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 788635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self setHasFocus:YES]; 789635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return YES; 7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 792635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (BOOL)resignFirstResponder 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 794635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self setHasFocus:NO]; 795635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return YES; 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 798635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (WebDataSource *)dataSource 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 800cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return [[self webFrame] _dataSource]; 8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 803635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (WebFrame *)webFrame 8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 805cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return kit(_element->document()->frame()); 8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (WebView *)webView 8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 810635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return [[self webFrame] webView]; 8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 813635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (NSWindow *)currentWindow 8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 815635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return [self window] ? [self window] : [[self webView] hostWindow]; 8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 818563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (WebCore::HTMLPlugInElement*)element 819563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 820563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return _element.get(); 821563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 822563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 823635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)cut:(id)sender 8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [self sendModifierEventWithKeyCode:7 character:'x']; 8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 828635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)copy:(id)sender 8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [self sendModifierEventWithKeyCode:8 character:'c']; 8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 833635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)paste:(id)sender 8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [self sendModifierEventWithKeyCode:9 character:'v']; 8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)selectAll:(id)sender 8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [self sendModifierEventWithKeyCode:0 character:'a']; 8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 843635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// AppKit doesn't call mouseDown or mouseUp on right-click. Simulate control-click 844635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// mouseDown and mouseUp so plug-ins get the right-click event as they do in Carbon (3125743). 845635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)rightMouseDown:(NSEvent *)theEvent 8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 847635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self mouseDown:theEvent]; 8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 850635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (void)rightMouseUp:(NSEvent *)theEvent 8518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 852635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [self mouseUp:theEvent]; 8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 8560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (BOOL)convertFromX:(double)sourceX andY:(double)sourceY space:(NPCoordinateSpace)sourceSpace 8570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch toX:(double *)destX andY:(double *)destY space:(NPCoordinateSpace)destSpace 8580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 8590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Nothing to do 8602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (sourceSpace == destSpace) { 8612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (destX) 8622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *destX = sourceX; 8632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (destY) 8642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *destY = sourceY; 8652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return YES; 8662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 8670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 8680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch NSPoint sourcePoint = NSMakePoint(sourceX, sourceY); 8690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 8700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch NSPoint sourcePointInScreenSpace; 8710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 8720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // First convert to screen space 8730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch switch (sourceSpace) { 8740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPCoordinateSpacePlugin: 8750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch sourcePointInScreenSpace = [self convertPoint:sourcePoint toView:nil]; 8760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch sourcePointInScreenSpace = [[self currentWindow] convertBaseToScreen:sourcePointInScreenSpace]; 8770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 8780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 8790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPCoordinateSpaceWindow: 8800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch sourcePointInScreenSpace = [[self currentWindow] convertBaseToScreen:sourcePoint]; 8810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 8820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 8830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPCoordinateSpaceFlippedWindow: 8840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch sourcePoint.y = [[self currentWindow] frame].size.height - sourcePoint.y; 8850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch sourcePointInScreenSpace = [[self currentWindow] convertBaseToScreen:sourcePoint]; 8860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 8870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 8880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPCoordinateSpaceScreen: 8890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch sourcePointInScreenSpace = sourcePoint; 8900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 8910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 8920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPCoordinateSpaceFlippedScreen: 8930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch sourcePoint.y = [[[NSScreen screens] objectAtIndex:0] frame].size.height - sourcePoint.y; 8940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch sourcePointInScreenSpace = sourcePoint; 8950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 8960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch default: 8970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return FALSE; 8980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 8990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch NSPoint destPoint; 9010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Then convert back to the destination space 9030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch switch (destSpace) { 9040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPCoordinateSpacePlugin: 9050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch destPoint = [[self currentWindow] convertScreenToBase:sourcePointInScreenSpace]; 9060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch destPoint = [self convertPoint:destPoint fromView:nil]; 9070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 9080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPCoordinateSpaceWindow: 9100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch destPoint = [[self currentWindow] convertScreenToBase:sourcePointInScreenSpace]; 9110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 9120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPCoordinateSpaceFlippedWindow: 9140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch destPoint = [[self currentWindow] convertScreenToBase:sourcePointInScreenSpace]; 9150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch destPoint.y = [[self currentWindow] frame].size.height - destPoint.y; 9160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 9170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPCoordinateSpaceScreen: 9190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch destPoint = sourcePointInScreenSpace; 9200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 9210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case NPCoordinateSpaceFlippedScreen: 9230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch destPoint = sourcePointInScreenSpace; 9240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch destPoint.y = [[[NSScreen screens] objectAtIndex:0] frame].size.height - destPoint.y; 9250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 9260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch default: 9280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return FALSE; 9290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 9300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (destX) 9320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *destX = destPoint.x; 9330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (destY) 9340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *destY = destPoint.y; 9350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return TRUE; 9370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 9380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 94006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen- (CString)resolvedURLStringForURL:(const char*)url target:(const char*)target 9410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 9420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch String relativeURLString = String::fromUTF8(url); 9430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (relativeURLString.isNull()) 9440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return CString(); 9450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Frame* frame = core([self webFrame]); 9470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!frame) 9480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return CString(); 9490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Frame* targetFrame = frame->tree()->find(String::fromUTF8(target)); 9510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!targetFrame) 9520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return CString(); 9530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!frame->document()->securityOrigin()->canAccess(targetFrame->document()->securityOrigin())) 9550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return CString(); 9560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch KURL absoluteURL = targetFrame->loader()->completeURL(relativeURLString); 9580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return absoluteURL.string().utf8(); 9590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 9600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)invalidatePluginContentRect:(NSRect)rect 9620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 9630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (RenderBoxModelObject *renderer = toRenderBoxModelObject(_element->renderer())) { 9640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch IntRect contentRect(rect); 9650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch contentRect.move(renderer->borderLeft() + renderer->paddingLeft(), renderer->borderTop() + renderer->paddingTop()); 9660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch renderer->repaintRectangle(contentRect); 9680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 9690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 9700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 97165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSRect)actualVisibleRectInWindow 97265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 97365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RenderObject* renderer = _element->renderer(); 97465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!renderer || !renderer->view()) 97565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NSZeroRect; 97665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 97765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch FrameView* frameView = renderer->view()->frameView(); 97865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!frameView) 97965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NSZeroRect; 98065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 98165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntRect widgetRect = renderer->absoluteClippedOverflowRect(); 98265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch widgetRect = frameView->contentsToWindow(widgetRect); 98365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return intersection(toRenderWidget(renderer)->windowClipRect(), widgetRect); 98465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 98565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 986967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#ifndef BUILDING_ON_TIGER 987967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (CALayer *)pluginLayer 988967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{ 989967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch ASSERT_NOT_REACHED(); 990967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return nil; 991967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} 992967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif 993967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 994635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project@end 9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WebKit { 9970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 9980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool getAuthenticationInfo(const char* protocolStr, const char* hostStr, int32_t port, const char* schemeStr, const char* realmStr, 9990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch CString& username, CString& password) 10000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 10010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (strcasecmp(protocolStr, "http") != 0 && 10020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch strcasecmp(protocolStr, "https") != 0) 10030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 10040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 10050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch NSString *host = [NSString stringWithUTF8String:hostStr]; 10060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!hostStr) 10070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 10080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 10090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch NSString *protocol = [NSString stringWithUTF8String:protocolStr]; 10100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!protocol) 10110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 10120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 10130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch NSString *realm = [NSString stringWithUTF8String:realmStr]; 10140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!realm) 10150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return NPERR_GENERIC_ERROR; 10160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 10170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch NSString *authenticationMethod = NSURLAuthenticationMethodDefault; 10180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!strcasecmp(protocolStr, "http")) { 10190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!strcasecmp(schemeStr, "basic")) 10200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch authenticationMethod = NSURLAuthenticationMethodHTTPBasic; 10210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch else if (!strcasecmp(schemeStr, "digest")) 10220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch authenticationMethod = NSURLAuthenticationMethodHTTPDigest; 10230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 10240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 10250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RetainPtr<NSURLProtectionSpace> protectionSpace(AdoptNS, [[NSURLProtectionSpace alloc] initWithHost:host port:port protocol:protocol realm:realm authenticationMethod:authenticationMethod]); 10260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1027231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block NSURLCredential *credential = mac(CredentialStorage::get(core(protectionSpace.get()))); 10280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!credential) 10290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch credential = [[NSURLCredentialStorage sharedCredentialStorage] defaultCredentialForProtectionSpace:protectionSpace.get()]; 10300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!credential) 10310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 10320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 10330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (![credential hasPassword]) 10340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 10350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 10360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch username = [[credential user] UTF8String]; 10370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch password = [[credential password] UTF8String]; 10380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 10390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return true; 10400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 10410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 10420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace WebKit 10430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1044635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // ENABLE(NETSCAPE_PLUGIN_API) 10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1046