ScriptControllerMac.mm revision 53733164eb6cabab5a1eddcabb42e4ce27eb0e44
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 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 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF 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#import "config.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "ScriptController.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3253733164eb6cabab5a1eddcabb42e4ce27eb0e44Ben Murdoch#import "BridgeJSC.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "DOMAbstractViewFrame.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "DOMWindow.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "Frame.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "FrameLoader.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "FrameLoaderClient.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "JSDOMWindow.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebScriptObjectPrivate.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "Widget.h" 411325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#import "objc_instance.h" 421325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#import "runtime_root.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <JavaScriptCore/APICast.h> 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <runtime/JSLock.h> 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(NETSCAPE_PLUGIN_API) 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "c_instance.h" 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "NP_jsobject.h" 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "npruntime_impl.h" 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5221939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(JAVA_BRIDGE) 537728885e97a2af41cfee93c614a8bbc66a426a31Steve Block#import "JavaInstanceJSC.h" 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSObject (WebPlugin) 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)objectForWebScript; 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NPObject *)createPluginScriptableObject; 59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (PassRefPtr<JSC::Bindings::Instance>)createPluginBindingsInstance:(PassRefPtr<JSC::Bindings::RootObject>)rootObject; 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace JSC::Bindings; 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectPassScriptInstance ScriptController::createScriptInstanceForWidget(Widget* widget) 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView* widgetView = widget->platformWidget(); 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!widgetView) 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<RootObject> rootObject = createRootObject(widgetView); 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if ([widgetView respondsToSelector:@selector(createPluginBindingsInstance:)]) 75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return [widgetView createPluginBindingsInstance:rootObject.release()]; 76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([widgetView respondsToSelector:@selector(objectForWebScript)]) { 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project id objectForWebScript = [widgetView objectForWebScript]; 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!objectForWebScript) 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return JSC::Bindings::ObjcInstance::create(objectForWebScript, rootObject.release()); 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([widgetView respondsToSelector:@selector(createPluginScriptableObject)]) { 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !ENABLE(NETSCAPE_PLUGIN_API) 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPObject* npObject = [widgetView createPluginScriptableObject]; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!npObject) 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Instance> instance = JSC::Bindings::CInstance::create(npObject, rootObject.release()); 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // -createPluginScriptableObject returns a retained NPObject. The caller is expected to release it. 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _NPN_ReleaseObject(npObject); 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return instance.release(); 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9821939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(JAVA_BRIDGE) 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jobject applet = m_frame->loader()->client()->javaApplet(widgetView); 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!applet) 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return JSC::Bindings::JavaInstance::create(applet, rootObject.release()); 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebScriptObject* ScriptController::windowScriptObject() 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!canExecuteScripts(NotAboutToExecuteScript)) 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_windowScriptObject) { 1140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSC::JSLock lock(JSC::SilenceAssertionsOnly); 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSC::Bindings::RootObject* root = bindingRootObject(); 116cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_windowScriptObject = [WebScriptObject scriptObjectForJSObject:toRef(windowShell(pluginWorld())) originRootObject:root rootObject:root]; 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT([m_windowScriptObject.get() isKindOfClass:[DOMAbstractView class]]); 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_windowScriptObject.get(); 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ScriptController::updatePlatformScriptObjects() 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_windowScriptObject) { 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSC::Bindings::RootObject* root = bindingRootObject(); 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [m_windowScriptObject.get() _setOriginRootObject:root andRootObject:root]; 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScriptController::disconnectPlatformScriptObjects() 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_windowScriptObject) { 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT([m_windowScriptObject.get() isKindOfClass:[DOMAbstractView class]]); 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [(DOMAbstractView *)m_windowScriptObject.get() _disconnectFrame]; 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13921939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(JAVA_BRIDGE) 140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic pthread_t mainThread; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic void updateStyleIfNeededForBindings(JSC::ExecState*, JSC::JSObject* rootObject) 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pthread_self() != mainThread) 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!rootObject) 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSDOMWindow* window = static_cast<JSDOMWindow*>(rootObject); 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!window) 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* frame = window->impl()->frame(); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!frame) 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian frame->document()->updateStyleIfNeeded(); 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScriptController::initJavaJSBindings() 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mainThread = pthread_self(); 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSC::Bindings::JavaJSObject::initializeJNIThreading(); 1665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSC::Bindings::Instance::setDidExecuteFunction(updateStyleIfNeededForBindings); 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 168635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 172