1 /* 2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 28 #include "Page.h" 29 #include "PluginMainThreadScheduler.h" 30 #include "PluginView.h" 31 #include "npruntime_internal.h" 32 33 using namespace WebCore; 34 35 // The plugin view is always the ndata of the instance,. Sometimes, plug-ins will call an instance-specific function 36 // with a NULL instance. To workaround this, call the last plug-in view that made a call to a plug-in. 37 // Currently, the current plug-in view is only set before NPP_New in PluginView::start. 38 // This specifically works around Flash and Shockwave. When we call NPP_New, they call NPN_Useragent with a NULL instance. 39 static PluginView* pluginViewForInstance(NPP instance) 40 { 41 if (instance && instance->ndata) 42 return static_cast<PluginView*>(instance->ndata); 43 return PluginView::currentPluginView(); 44 } 45 46 void* NPN_MemAlloc(uint32_t size) 47 { 48 return malloc(size); 49 } 50 51 void NPN_MemFree(void* ptr) 52 { 53 free(ptr); 54 } 55 56 uint32_t NPN_MemFlush(uint32_t size) 57 { 58 // Do nothing 59 return 0; 60 } 61 62 void NPN_ReloadPlugins(NPBool reloadPages) 63 { 64 Page::refreshPlugins(reloadPages); 65 } 66 67 NPError NPN_RequestRead(NPStream* stream, NPByteRange* rangeList) 68 { 69 return NPERR_STREAM_NOT_SEEKABLE; 70 } 71 72 NPError NPN_GetURLNotify(NPP instance, const char* url, const char* target, void* notifyData) 73 { 74 return pluginViewForInstance(instance)->getURLNotify(url, target, notifyData); 75 } 76 77 NPError NPN_GetURL(NPP instance, const char* url, const char* target) 78 { 79 return pluginViewForInstance(instance)->getURL(url, target); 80 } 81 82 NPError NPN_PostURLNotify(NPP instance, const char* url, const char* target, uint32_t len, const char* buf, NPBool file, void* notifyData) 83 { 84 return pluginViewForInstance(instance)->postURLNotify(url, target, len, buf, file, notifyData); 85 } 86 87 NPError NPN_PostURL(NPP instance, const char* url, const char* target, uint32_t len, const char* buf, NPBool file) 88 { 89 return pluginViewForInstance(instance)->postURL(url, target, len, buf, file); 90 } 91 92 NPError NPN_NewStream(NPP instance, NPMIMEType type, const char* target, NPStream** stream) 93 { 94 return pluginViewForInstance(instance)->newStream(type, target, stream); 95 } 96 97 int32_t NPN_Write(NPP instance, NPStream* stream, int32_t len, void* buffer) 98 { 99 return pluginViewForInstance(instance)->write(stream, len, buffer); 100 } 101 102 NPError NPN_DestroyStream(NPP instance, NPStream* stream, NPReason reason) 103 { 104 return pluginViewForInstance(instance)->destroyStream(stream, reason); 105 } 106 107 const char* NPN_UserAgent(NPP instance) 108 { 109 PluginView* view = pluginViewForInstance(instance); 110 111 if (!view) 112 return PluginView::userAgentStatic(); 113 114 return view->userAgent(); 115 } 116 117 void NPN_Status(NPP instance, const char* message) 118 { 119 pluginViewForInstance(instance)->status(message); 120 } 121 122 void NPN_InvalidateRect(NPP instance, NPRect* invalidRect) 123 { 124 pluginViewForInstance(instance)->invalidateRect(invalidRect); 125 } 126 127 void NPN_InvalidateRegion(NPP instance, NPRegion invalidRegion) 128 { 129 pluginViewForInstance(instance)->invalidateRegion(invalidRegion); 130 } 131 132 void NPN_ForceRedraw(NPP instance) 133 { 134 pluginViewForInstance(instance)->forceRedraw(); 135 } 136 137 NPError NPN_GetValue(NPP instance, NPNVariable variable, void* value) 138 { 139 PluginView* view = pluginViewForInstance(instance); 140 141 if (!view) 142 return PluginView::getValueStatic(variable, value); 143 144 return pluginViewForInstance(instance)->getValue(variable, value); 145 } 146 147 NPError NPN_SetValue(NPP instance, NPPVariable variable, void* value) 148 { 149 return pluginViewForInstance(instance)->setValue(variable, value); 150 } 151 152 void* NPN_GetJavaEnv() 153 { 154 // Unsupported 155 return 0; 156 } 157 158 void* NPN_GetJavaPeer(NPP instance) 159 { 160 // Unsupported 161 return 0; 162 } 163 164 void NPN_PushPopupsEnabledState(NPP instance, NPBool enabled) 165 { 166 pluginViewForInstance(instance)->pushPopupsEnabledState(enabled); 167 } 168 169 void NPN_PopPopupsEnabledState(NPP instance) 170 { 171 pluginViewForInstance(instance)->popPopupsEnabledState(); 172 } 173 174 extern "C" typedef void PluginThreadAsyncCallFunction(void*); 175 void NPN_PluginThreadAsyncCall(NPP instance, PluginThreadAsyncCallFunction func, void* userData) 176 { 177 // Callback function type only differs from MainThreadFunction by being extern "C", which doesn't affect calling convention on any compilers we use. 178 PluginMainThreadScheduler::scheduler().scheduleCall(instance, reinterpret_cast<PluginMainThreadScheduler::MainThreadFunction*>(func), userData); 179 } 180 181 NPError NPN_GetValueForURL(NPP instance, NPNURLVariable variable, const char* url, char** value, uint32_t* len) 182 { 183 return pluginViewForInstance(instance)->getValueForURL(variable, url, value, len); 184 } 185 186 NPError NPN_SetValueForURL(NPP instance, NPNURLVariable variable, const char* url, const char* value, uint32_t len) 187 { 188 return pluginViewForInstance(instance)->setValueForURL(variable, url, value, len); 189 } 190 191 NPError NPN_GetAuthenticationInfo(NPP instance, const char* protocol, const char* host, int32_t port, const char* scheme, const char* realm, char** username, uint32_t* ulen, char** password, uint32_t* plen) 192 { 193 return pluginViewForInstance(instance)->getAuthenticationInfo(protocol, host, port, scheme, realm, username, ulen, password, plen); 194 } 195 196 #ifdef PLUGIN_SCHEDULE_TIMER 197 uint32_t NPN_ScheduleTimer(NPP instance, uint32_t interval, NPBool repeat, 198 void (*timerFunc)(NPP npp, uint32_t timerID)) 199 { 200 return pluginViewForInstance(instance)->scheduleTimer(instance, interval, 201 repeat != 0, timerFunc); 202 } 203 204 void NPN_UnscheduleTimer(NPP instance, uint32_t timerID) 205 { 206 pluginViewForInstance(instance)->unscheduleTimer(instance, timerID); 207 } 208 #endif 209