void CPlugin::SetURLCookie(const CString& strURL, const CString& strCookie) { char* url = CStringToNPStringCharacters(strURL); char* cookie = CStringToNPStringCharacters(strCookie); if (NPN_SetValueForURL(m_pNPInstance, NPNURLVCookie, url, cookie, (uint32_t)strlen(cookie)) != NPERR_NO_ERROR) { TRACE(_T("[CPlugin::SetURLCookie] NPN_SetValueForURL failed! URL: %s"), strURL); } NPN_MemFree(cookie); NPN_MemFree(url); }
bool ScriptablePluginObject::InvokeDefault(const NPVariant *args, uint32_t argCount, NPVariant *result) { CString strMessage(_T("Welcome to use the IEMode Plugin for firefox!")); STRINGZ_TO_NPVARIANT(CStringToNPStringCharacters(strMessage), *result); return true; }
void CPlugin::SetStatus(const CString& text) { if (m_pNPInstance) { char* message = CStringToNPStringCharacters(text); NPN_Status(m_pNPInstance, message); NPN_MemFree(message); } }
// This function is equivalent to the following JavaScript function: // function FireEvent(strEventType, strDetail) { // FireIEContainer.dispatchEvent(strEventType, strDetail) // } // // Uses following JavaScript code to listen to the event fired: // pluginObject.addEventListener(strEventType, function(event) { // alert(event.detail); // } BOOL CPlugin::FireEvent(const CString &strEventType, const CString &strDetail) { // Fast event dispatching, requires helper function in container object try { // FireIEContainer.dispatchEvent(strEventType, strDetail); NPObject* pContainer = GetContainer(); NPVariant args[2]; STRINGZ_TO_NPVARIANT(CStringToNPStringCharacters(strEventType), args[0]); STRINGZ_TO_NPVARIANT(CStringToNPStringCharacters(strDetail), args[1]); NPVariant vSucceeded; VOID_TO_NPVARIANT(vSucceeded); BOOL bOK = NPN_Invoke(m_pNPInstance, pContainer, GetIdentifier("dispatchEvent"), args, 2, &vSucceeded); for (int i = 0; i < 2; i++) NPN_ReleaseVariantValue(&args[i]); if (!bOK || !NPVARIANT_IS_BOOLEAN(vSucceeded)) { NPN_ReleaseVariantValue(&vSucceeded); throw CString(_T("Cannot invoke dispatchEvent")); } bool bSucceeded = NPVARIANT_TO_BOOLEAN(vSucceeded); NPN_ReleaseVariantValue(&vSucceeded); if (!bSucceeded) throw CString(_T("Event dispatch failed")); return TRUE; } catch (const CString& strMessage) { UNUSED(strMessage); TRACE(_T("[CPlugin::FireEvent Exception] Fast event dispatching failed: %s\n"), strMessage); return FALSE; } }
void CPlugin::SetStatus(const CString& text) { if (ShouldShowStatusOurselves()) { FireEvent(_T("IEStatusChanged"), text); return; } if (m_pNPInstance) { char* message = CStringToNPStringCharacters(text); NPN_Status(m_pNPInstance, message); NPN_MemFree(message); } }
bool ScriptablePluginObject::GetProperty(NPIdentifier name, NPVariant *result) { if (m_pMainWindow == NULL) return false; // readonly property {string} URL if (name == m_URLID) { CString URL = m_pMainWindow->GetURL(); STRINGZ_TO_NPVARIANT(CStringToNPStringCharacters(URL), *result); return true; } // readonly property {title} LocationURL else if (name == m_TitleID) { CString title = m_pMainWindow->GetTitle(); STRINGZ_TO_NPVARIANT(CStringToNPStringCharacters(title), *result); return true; } // readonly property {boolean} CanRefresh else if (name == m_CanRefreshID) { BOOL canRefresh = m_pMainWindow->GetCanRefresh(); BOOLEAN_TO_NPVARIANT(canRefresh, *result); return true; } // readonly property {boolean} CanStop else if (name == m_CanStopID) { BOOL canStop = m_pMainWindow->GetCanStop(); BOOLEAN_TO_NPVARIANT(canStop, *result); return true; } // readonly property {boolean} CanBack else if (name == m_CanBackID) { BOOL canBack = m_pMainWindow->GetCanBack(); BOOLEAN_TO_NPVARIANT(canBack, *result); return true; } // readonly property {boolean} CanForward else if (name == m_CanForwardID) { BOOL canForward = m_pMainWindow->GetCanForward(); BOOLEAN_TO_NPVARIANT(canForward, *result); return true; } // readonly property {boolean} CanCopy else if (name == m_CanCopyID) { BOOL canCopy = m_pMainWindow->GetCanCopy(); BOOLEAN_TO_NPVARIANT(canCopy, *result); return true; } // readonly property {boolean} CanCut else if (name == m_CanCutID) { BOOL canCut = m_pMainWindow->GetCanCut(); BOOLEAN_TO_NPVARIANT(canCut, *result); return true; } // readonly property {boolean} CanPaste else if (name == m_CanPasteID) { BOOL canPaste = m_pMainWindow->GetCanPaste(); BOOLEAN_TO_NPVARIANT(canPaste, *result); return true; } // readonly property {boolean} CanSelectAll else if (name == m_CanSelectAllID) { BOOL canSelectAll = m_pMainWindow->GetCanSelectAll(); BOOLEAN_TO_NPVARIANT(canSelectAll, *result); return true; } // readonly property {boolean} Progress else if (name == m_ProgressID) { INT32_TO_NPVARIANT(m_pMainWindow->GetProgress(),*result); return true; } VOID_TO_NPVARIANT(*result); return true; }
// This function is equivalent to the following JavaScript function: // function FireEvent(strEventType, strDetail) { // var event = document.createEvent("CustomEvent"); // event.initCustomEvent(strEventType, true, true, strDetail); // pluginObject.dispatchEvent(event); // } // // Uses following JavaScript code to listen to the event fired: // pluginObject.addEventListener(strEventType, function(event) { // alert(event.detail); // } BOOL CPlugin::FireEvent(const CString &strEventType, const CString &strDetail) { BOOL bOK = FALSE; NPObject* pWindow = NULL; NPVariant vDocument; VOID_TO_NPVARIANT(vDocument); NPVariant vEvent; NPObject* pDocument = NULL; VOID_TO_NPVARIANT(vEvent); NPObject *pEvent = NULL; NPObject* pPlugin = NULL; try { // get window object if (NPN_GetValue(m_pNPInstance, NPNVWindowNPObject, &pWindow) != NPERR_NO_ERROR || pWindow == NULL) { throw CString(_T("Cannot get window")); } // get window.document bOK = NPN_GetProperty(m_pNPInstance, pWindow, NPN_GetStringIdentifier("document"), &vDocument); if (!NPVARIANT_IS_OBJECT(vDocument) || !bOK) { throw CString(_T("Cannot get window.document")); } pDocument = NPVARIANT_TO_OBJECT(vDocument); // var event = document.createEvent("CustomEvent"); if (pDocument) { NPVariant arg; STRINGZ_TO_NPVARIANT(CStringToNPStringCharacters(_T("CustomEvent")), arg); bOK = NPN_Invoke(m_pNPInstance, pDocument, NPN_GetStringIdentifier("createEvent"), &arg, 1, &vEvent); NPN_ReleaseVariantValue(&arg); if (!NPVARIANT_IS_OBJECT(vEvent) || !bOK) { throw CString(_T("Cannot document.createEvent")); } } else { throw CString(_T("window.document is null")); } pEvent = NPVARIANT_TO_OBJECT(vEvent);; // event.initCustomEvent(strEventType, true, true, strDetail); if (pEvent) { NPVariant args[4]; STRINGZ_TO_NPVARIANT(CStringToNPStringCharacters(strEventType), args[0]); BOOLEAN_TO_NPVARIANT(true, args[1]); BOOLEAN_TO_NPVARIANT(true, args[2]); STRINGZ_TO_NPVARIANT(CStringToNPStringCharacters(strDetail), args[3]); NPVariant vResult; bOK = NPN_Invoke(m_pNPInstance, pEvent, NPN_GetStringIdentifier("initCustomEvent"), args, 4, &vResult); for (int i=0; i<4; i++) { NPN_ReleaseVariantValue(&args[i]); } NPN_ReleaseVariantValue(&vResult); if (!bOK) { throw CString(_T("Cannot event.initCustomEvent")); } } else { throw CString(_T("event is null")); } // get plugin object if (NPN_GetValue(m_pNPInstance, NPNVPluginElementNPObject, &pPlugin) != NPERR_NO_ERROR || pPlugin == NULL) { throw CString(_T("Cannot get window")); } // pluginObject.dispatchEvent(event); NPVariant vNotCanceled; bOK = NPN_Invoke(m_pNPInstance, pPlugin, NPN_GetStringIdentifier("dispatchEvent"), &vEvent, 1, &vNotCanceled); NPN_ReleaseVariantValue(&vEvent); if (!bOK || !NPVARIANT_IS_BOOLEAN(vNotCanceled)) { throw CString(_T("Cannot dispatchEvent")); } if (NPVARIANT_TO_BOOLEAN(vNotCanceled) != true) { throw CString(_T("Event is canceled")); } } catch (CString strMessage) { TRACE(_T("[CPlugin::FireEvent Exception] %s"), strMessage); bOK = FALSE; } if (pPlugin != NULL) NPN_ReleaseObject(pPlugin); if (!NPVARIANT_IS_VOID(vEvent)) NPN_ReleaseVariantValue(&vEvent); if (!NPVARIANT_IS_VOID(vDocument)) NPN_ReleaseVariantValue(&vDocument); if (pWindow != NULL) NPN_ReleaseObject(pWindow); return bOK; }