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