diff -r 000000000000 -r dd21522fd290 webengine/osswebengine/WebKit/s60/plugins/NpnImplementation.cpp --- /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 +#include +#include +#include + +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(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); +} + + +