ScriptControllerMac.mm revision 635860845790a19bf50bbc51ba8fb66a96dde068
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 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "DOMAbstractViewFrame.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "DOMWindow.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "Frame.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "FrameLoader.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "FrameLoaderClient.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "JSDOMWindow.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebScriptObjectPrivate.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "Widget.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <JavaScriptCore/APICast.h> 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <runtime/JSLock.h> 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(NETSCAPE_PLUGIN_API) 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "c_instance.h" 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "NP_jsobject.h" 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "npruntime_impl.h" 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "objc_instance.h" 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "runtime_root.h" 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "runtime.h" 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(MAC_JAVA_BRIDGE) 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "jni_instance.h" 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSObject (WebPlugin) 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)objectForWebScript; 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NPObject *)createPluginScriptableObject; 60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (PassRefPtr<JSC::Bindings::Instance>)createPluginBindingsInstance:(PassRefPtr<JSC::Bindings::RootObject>)rootObject; 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace JSC::Bindings; 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectPassScriptInstance ScriptController::createScriptInstanceForWidget(Widget* widget) 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView* widgetView = widget->platformWidget(); 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!widgetView) 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<RootObject> rootObject = createRootObject(widgetView); 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if ([widgetView respondsToSelector:@selector(createPluginBindingsInstance:)]) 76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return [widgetView createPluginBindingsInstance:rootObject.release()]; 77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([widgetView respondsToSelector:@selector(objectForWebScript)]) { 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project id objectForWebScript = [widgetView objectForWebScript]; 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!objectForWebScript) 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return JSC::Bindings::ObjcInstance::create(objectForWebScript, rootObject.release()); 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([widgetView respondsToSelector:@selector(createPluginScriptableObject)]) { 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !ENABLE(NETSCAPE_PLUGIN_API) 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPObject* npObject = [widgetView createPluginScriptableObject]; 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!npObject) 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Instance> instance = JSC::Bindings::CInstance::create(npObject, rootObject.release()); 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // -createPluginScriptableObject returns a retained NPObject. The caller is expected to release it. 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _NPN_ReleaseObject(npObject); 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return instance.release(); 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(MAC_JAVA_BRIDGE) 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jobject applet = m_frame->loader()->client()->javaApplet(widgetView); 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!applet) 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return JSC::Bindings::JavaInstance::create(applet, rootObject.release()); 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWebScriptObject* ScriptController::windowScriptObject() 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isEnabled()) 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_windowScriptObject) { 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSC::JSLock lock(false); 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSC::Bindings::RootObject* root = bindingRootObject(); 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_windowScriptObject = [WebScriptObject scriptObjectForJSObject:toRef(windowShell()) originRootObject:root rootObject:root]; 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT([m_windowScriptObject.get() isKindOfClass:[DOMAbstractView class]]); 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_windowScriptObject.get(); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ScriptController::updatePlatformScriptObjects() 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_windowScriptObject) { 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSC::Bindings::RootObject* root = bindingRootObject(); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [m_windowScriptObject.get() _setOriginRootObject:root andRootObject:root]; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScriptController::disconnectPlatformScriptObjects() 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_windowScriptObject) { 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT([m_windowScriptObject.get() isKindOfClass:[DOMAbstractView class]]); 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [(DOMAbstractView *)m_windowScriptObject.get() _disconnectFrame]; 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(MAC_JAVA_BRIDGE) 141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic pthread_t mainThread; 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void updateRenderingForBindings(JSC::ExecState*, JSC::JSObject* rootObject) 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pthread_self() != mainThread) 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!rootObject) 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSDOMWindow* window = static_cast<JSDOMWindow*>(rootObject); 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!window) 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* frame = window->impl()->frame(); 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!frame) 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* document = frame->document(); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!document) 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document->updateRendering(); 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ScriptController::initJavaJSBindings() 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mainThread = pthread_self(); 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSC::Bindings::JavaJSObject::initializeJNIThreading(); 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSC::Bindings::Instance::setDidExecuteFunction(updateRenderingForBindings); 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 177