webengine/osswebengine/WebKit/s60/plugins/NpnImplementation.cpp
changeset 0 dd21522fd290
child 1 7c90e6132015
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/WebKit/s60/plugins/NpnImplementation.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,503 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Browser's Netscape API
+*
+*/
+
+#include "config.h"
+#include "../../bidi.h"
+#include "HttpDefs.h"
+#include "NpnImplementation.h"
+#include "PluginWin.h"
+#include "PluginSkin.h"
+#include <CUserAgent.h>
+#include <Element.h>
+#include <HTMLPlugInElement.h>
+#include <HTMLNames.h>
+
+using namespace WebCore::HTMLNames;
+
+
+
+// -----------------------------------------------------------------------------
+// NpnUrlLoader
+//
+// Requests the associated pluginInst to load the given url.
+// -----------------------------------------------------------------------------
+//
+NPError NpnUrlLoader(NPP aInstance, const TDesC& aUrl, TUint8 aMethod,
+                     const TDesC* aWindowType, const TDesC& aBuf,
+                     TBool aFromFile, TBool aNotify, void* aNotifyData)
+{
+      
+    PluginWin* pluginWin = (PluginWin* )aInstance->ndata;
+    if ( !pluginWin ) {
+        return NPERR_INVALID_INSTANCE_ERROR;
+    }
+
+    TInt status = KErrNone;
+    
+    // Make the load request
+        // convert to 8 bit
+        HBufC8* url = HBufC8::NewLC(aUrl.Length());
+        url->Des().Copy(aUrl);    
+        if (aMethod==EUrlGet) {
+            TRAP_IGNORE(status = pluginWin->pluginSkin()->getRequestL(*url, aNotify, aNotifyData, aWindowType));
+        }
+        else if (aMethod==EUrlPost) {
+            TRAP_IGNORE(status = pluginWin->pluginSkin()->postRequestL(*url, aBuf, aFromFile, aNotify, aNotifyData, aWindowType));
+        }
+
+        CleanupStack::PopAndDestroy(url);
+
+    // Convert to NPError
+    switch (status) {
+        case KErrNone:
+            return NPERR_NO_ERROR;
+
+        case KErrNoMemory:
+            return NPERR_OUT_OF_MEMORY_ERROR;
+
+        default:
+            return NPERR_GENERIC_ERROR;
+    }
+    
+}
+
+// -----------------------------------------------------------------------------
+// NpnGetUrl
+//
+// Requests the associated pluginInst to load the given url.
+// -----------------------------------------------------------------------------
+//
+NPError NpnGetUrl(NPP aInstance, const TDesC& aUrl, const TDesC* aWindowType)
+{
+    TPtrC nullPtr(NULL, 0);
+    return NpnUrlLoader(aInstance, aUrl, EUrlGet, aWindowType, nullPtr,
+                        EFalse, EFalse, NULL);
+}
+
+// -----------------------------------------------------------------------------
+// NpnPostUrl
+//
+// Requests the associated pluginInst to POST to the given url.
+// -----------------------------------------------------------------------------
+//
+NPError NpnPostUrl(NPP aInstance, const TDesC& aUrl, const TDesC* aWindowType,
+                    const TDesC& aBuf, NPBool aFile)
+{
+    return NpnUrlLoader(aInstance, aUrl, EUrlPost, aWindowType, aBuf,
+                        aFile, EFalse, NULL);
+}
+
+// -----------------------------------------------------------------------------
+// NpnRequestRead
+//
+// Unsupported.
+// -----------------------------------------------------------------------------
+//
+NPError NpnRequestRead(NPStream* /*aStream*/, NPByteRange* /*aRangeList*/)
+{
+    // This function is not supported
+    return NPERR_GENERIC_ERROR;
+}
+
+// -----------------------------------------------------------------------------
+// NpnNewStream
+//
+// Unsupported.
+// -----------------------------------------------------------------------------
+//
+NPError NpnNewStream(NPP /*aInstance*/, NPMIMEType /*aType*/,
+                      const TDesC* /*aWindowType*/, NPStream** /*aStream*/)
+{
+    // This function is not supported.
+    // It is specifically intended to create a new Browser window
+    return NPERR_GENERIC_ERROR;
+}
+
+// -----------------------------------------------------------------------------
+// NpnWrite
+//
+// Unsupported.
+// -----------------------------------------------------------------------------
+//
+TInt32 NpnWrite(NPP /*aInstance*/, NPStream* /*aStream*/,
+                TInt32 /*aLen*/, void* /*aBuffer*/)
+{
+    // This function is not supported.
+    return NPERR_GENERIC_ERROR;
+}
+
+// -----------------------------------------------------------------------------
+// NpnDestroyStream
+//
+// Unsupported.
+// -----------------------------------------------------------------------------
+//
+NPError NpnDestroyStream(NPP /*aInstance*/, NPStream* /*aStream*/,
+                        NPReason /*aReason*/)
+{
+    // This function is not supported.
+    return NPERR_GENERIC_ERROR;
+}
+
+// -----------------------------------------------------------------------------
+// NpnStatus
+//
+// Allows a plugin to report its current status to the associated PluginInst.
+// -----------------------------------------------------------------------------
+//
+void NpnStatus(NPP aInstance, const TDesC& aMessage)
+{
+    // This function is not supported.    
+}
+
+// -----------------------------------------------------------------------------
+// NpnUAgent
+//
+// Returns the user agent of the Series 60 Browser.
+// -----------------------------------------------------------------------------
+//
+const TDesC* NpnUAgent(NPP /*aInstance*/)
+{
+    // Get User Agent String    
+    CUserAgent* usrAgnt = CUserAgent::NewL();
+    CleanupStack::PushL( usrAgnt );
+
+    HBufC8* userAgent8 = usrAgnt->UserAgentL();
+    CleanupStack::PushL( userAgent8 );
+
+    HBufC* userAgent = HBufC::NewL(userAgent8->Length());
+    userAgent->Des().Copy(userAgent8->Des());
+
+
+    CleanupStack::PopAndDestroy(2);
+
+    return userAgent;    
+}
+
+// -----------------------------------------------------------------------------
+// NpnMemAlloc
+//
+// Allocates a chunk of memory on the behalf of the plugin.
+// -----------------------------------------------------------------------------
+//
+ void* NpnMemAlloc(uint32 aSize)
+{
+    if (aSize) {
+        return User::Alloc(aSize);
+    }
+    
+    return NULL;
+}
+
+// -----------------------------------------------------------------------------
+// NpnMemFree
+//
+// Deallocates a chunk of memory on the behalf of the plugin.
+// -----------------------------------------------------------------------------
+//
+ void NpnMemFree(void* aPtr)
+{
+    User::Free(aPtr);
+}
+
+// -----------------------------------------------------------------------------
+// NpnMemFlush
+//
+// Unsupported.
+// -----------------------------------------------------------------------------
+//
+uint32 NpnMemFlush(uint32 /*aSize*/)
+{
+    // This function is not supported
+    return NPERR_GENERIC_ERROR;
+}
+
+// -----------------------------------------------------------------------------
+// NpnReloadPlugins
+//
+// Causes the PluginHandler to scan for new plugins and reloads the current
+// page if aReloadPages is true.
+// -----------------------------------------------------------------------------
+//
+ void NpnReloadPlugins(NPBool /*aReloadPages*/)
+{
+    //This is currently not supported since CPluginHandler is non static
+}
+
+// -----------------------------------------------------------------------------
+// NpnGetJavaEnv
+//
+// Unsupported.
+// -----------------------------------------------------------------------------
+//
+JRIEnv* NpnGetJavaEnv()
+{
+    // This function is not supported
+    return NULL;
+}
+
+// -----------------------------------------------------------------------------
+// NpnGetJavaPeer
+//
+// Unsupported.
+// -----------------------------------------------------------------------------
+//
+jref NpnGetJavaPeer(NPP /*aInstance*/)
+{
+    // This function is not supported
+    return NULL;
+}
+
+// -----------------------------------------------------------------------------
+// NpnGetUrlNotify
+//
+// Requests the associated PluginInst to load the given url.  The plugin is
+// notified when the request completes.
+// -----------------------------------------------------------------------------
+//
+NPError NpnGetUrlNotify(NPP aInstance, const TDesC& aUrl,
+                        const TDesC* aWindowType, void* aNotifyData)
+{
+    TPtrC nullPtr(NULL, 0);
+    return NpnUrlLoader(aInstance, aUrl, EUrlGet, aWindowType, nullPtr,
+                        EFalse, ETrue, aNotifyData);
+                        
+}
+
+// -----------------------------------------------------------------------------
+// NpnPostUrlNotify
+//
+// Requests the associated PluginInst to POST to the given url.  The plugin is
+// notified when the request completes.
+// -----------------------------------------------------------------------------
+//
+ NPError NpnPostUrlNotify(NPP aInstance, const TDesC& aUrl,
+                          const TDesC* aWindowType, const TDesC& aBuf,
+                          NPBool aFile, void* aNotifyData)
+{
+    return NpnUrlLoader(aInstance, aUrl, EUrlPost, aWindowType, aBuf,
+                        aFile, ETrue, aNotifyData);
+}
+
+// -----------------------------------------------------------------------------
+// NpnGetValue
+//
+// Query the associated PluginInst for information.
+// -----------------------------------------------------------------------------
+//
+NPError NpnGetValue(NPP aInstance, NPNVariable aVariable, void *aRetValue)
+{
+    
+    switch (aVariable) {
+        
+        case NPNVjavascriptEnabledBool: // Tells whether JavaScript is enabled; true=JavaScript enabled, false=not enabled
+        // NEEDS IMPLEMENTATION
+        //  *((TBool*) aRetValue) = NW_Settings_GetEcmaScriptEnabled();
+        break;
+
+        case NPNVnetscapeWindow: {         
+
+            PluginWin* pluginWin = (PluginWin*)aInstance->ndata;
+            if (pluginWin) {
+                NPWindow* npWindow = (NPWindow*)aRetValue;
+                TRect rect = pluginWin->Rect();
+
+                npWindow->x = rect.iTl.iX;
+                npWindow->y = rect.iTl.iY;
+                npWindow->width = rect.Width();
+                npWindow->height = rect.Height();
+                npWindow->type = NPWindowTypeWindow;
+                npWindow->window = NULL;
+            
+                NPRect clipRect = {0,0,0,0};
+                npWindow->clipRect = clipRect;
+            }
+        }
+        break;
+        
+        case NPNVPluginElementNPObject: {
+		PluginWin* pluginWin = (PluginWin*)aInstance->ndata;
+        WebCore::Element* pluginElement;
+        if (pluginWin) {
+        	pluginElement = pluginWin->pluginSkin()->getElement();
+        }
+            
+        NPObject* pluginScriptObject = 0;
+        if (pluginElement->hasTagName(appletTag) || pluginElement->hasTagName(embedTag) || pluginElement->hasTagName(objectTag))
+			pluginScriptObject = static_cast<WebCore::HTMLPlugInElement*>(pluginElement)->getNPObject();
+            
+        if (pluginScriptObject)
+        	_NPN_RetainObject(pluginScriptObject);
+
+        void** v = (void**)aRetValue;
+        *v = pluginScriptObject;
+        }
+        break;
+        
+        case NPNVWindowNPObject: {
+            PluginWin* pluginWin = (PluginWin*)aInstance->ndata;
+            NPObject* windowObject = pluginWin->windowScriptNPObject();
+            if (windowObject) {
+                void **v = (void **)aRetValue;
+                *v = windowObject;
+                return NPERR_NO_ERROR;
+            }
+            return NPERR_GENERIC_ERROR;
+        }
+        case NPNVDOMWindow:
+        case NPNVxDisplay:          // Unix only: Returns the current Display
+        case NPNVxtAppContext:      // Unix only: Returns the application's XtAppContext
+        case NPNVasdEnabledBool:    // Tells whether SmartUpdate (former name: ASD) is enabled;
+                                    // true=SmartUpdate enabled, false=not enabled
+        case NPNVisOfflineBool:     // Tells whether offline mode is enabled;
+                                    // true=offline mode enabled, false=not enabled
+            
+        case NPNNetworkAccess:
+            PluginWin* pluginWin = (PluginWin*)aInstance->ndata;
+            TInt apId = -1;
+            if (pluginWin) {
+                apId = pluginWin->pluginSkin()->handleNetworkAccess();
+            }
+            *((TInt*) aRetValue) = apId;
+            break;
+            
+            
+        default:
+            *((TBool*) aRetValue) = EFalse;
+            break;
+    }   // end of switch
+    
+    return NPERR_NO_ERROR;
+
+}
+
+// -----------------------------------------------------------------------------
+// NpnSetValue
+//
+// Set a value on the associated PluginInst
+// -----------------------------------------------------------------------------
+//
+NPError NpnSetValue(NPP aInstance, NPPVariable aVariable, void* aSetValue)
+{
+    switch (aVariable) {
+        // Set a new plugin window size. This will resize the plugin rect,
+        // which requires a re-layout of the dom (render) tree.
+        case NPPVpluginWindowSize: {
+            PluginWin* pluginWin = (PluginWin*)aInstance->ndata;
+            if (pluginWin) {
+                NPWindow* npWindow = (NPWindow*)aSetValue;
+                if (npWindow) {
+                    TRect newRect(npWindow->x, npWindow->y, npWindow->width, npWindow->height);
+                    pluginWin->resizePluginRect(newRect);
+                }
+            }
+        }
+        break;
+        case NPPVpluginWindowBool:
+          {
+          PluginWin* pluginWin = (PluginWin*)aInstance->ndata;
+          if (pluginWin) {
+              NPBool* isWindowed = (NPBool*)aSetValue;
+              if (isWindowed)
+                  pluginWin->setWindowedPlugin(*isWindowed);
+              }
+          
+          }
+        break;          
+        case NPPVpluginTransparentBool:
+            {
+            PluginWin* pluginWin = (PluginWin*)aInstance->ndata;
+            if (pluginWin) {
+                NPBool* isTransparent = (NPBool*)aSetValue;
+                if (isTransparent)
+                    pluginWin->setTransparentPlugin(*isTransparent);
+            }          
+            }
+        break;
+        case NPPVPluginFocusPosition:
+            {
+            PluginWin* pluginWin = (PluginWin*)aInstance->ndata;
+            if (pluginWin) {
+                TPoint* focusPoint = (TPoint*) aSetValue;
+                if (focusPoint) {
+                    pluginWin->moveWindow(*focusPoint);
+                }
+            }
+        }
+        break;
+        case NPPVPluginDeactivate:
+            {
+            PluginWin* pluginWin = (PluginWin*)aInstance->ndata;
+            if (pluginWin) {
+                pluginWin->pluginDeactivate();
+            }
+        }
+        break;
+        case NPPVpluginFullScreenBool:
+            {
+            NPBool* isFullScreen = (NPBool*)aSetValue;
+            PluginWin* pluginWin = (PluginWin*)aInstance->ndata;
+            pluginWin->TogleScreenMode(*isFullScreen);
+            break;
+            }
+        default:
+        break;
+    
+    }   // end of switch
+      
+    return NPERR_NO_ERROR;
+}
+
+// -----------------------------------------------------------------------------
+// NpnInvalidateRect
+//
+// Unsupported.
+// -----------------------------------------------------------------------------
+//
+void NpnInvalidateRect(NPP aInstance, NPRect * /*aRect*/)
+{
+    PluginWin* pluginWin = (PluginWin*)aInstance->ndata;
+    if( pluginWin )
+        pluginWin->forceRedraw(false);
+}
+
+// -----------------------------------------------------------------------------
+// NpnInvalidateRegion
+//
+// Unsupported.
+// -----------------------------------------------------------------------------
+//
+void NpnInvalidateRegion(NPP /*aInstance*/, NPRegion /*aRegion*/)
+{
+// This function is not supported
+}
+
+// -----------------------------------------------------------------------------
+// NpnForceRedraw
+//
+// Unsupported.
+// -----------------------------------------------------------------------------
+//
+void NpnForceRedraw(NPP aInstance)
+{
+    PluginWin* pluginWin = (PluginWin*)aInstance->ndata;
+    if( pluginWin )
+        pluginWin->forceRedraw(true);
+}
+
+
+