On 12/22/2011 10:45 AM, lord_nemesis wrote:
Hello Benjamin (I am putting the name directly as I got help through
him and now having issue in that area),
    This issue is putting us in most discomfort situation in business
line... Please take time and help us out from here....

Problem:
   We have a page that that is throwing a JS exception when running in
our embedded gecko browser, but working fine in firefox. The page a
javascript function which checks the value of a global though an if
condition. the same is set an initial value in the<head>  section of
the page. some thing like this
I really have no clue about the correct way to do what you're doing. Perhaps bholley.

--BDS

test = "";

myfunc()
{
      if (test&&  ...) {
      }
}

as you can see, test is not a var type. Its a global property. In our
embedded gecko application, we are getting a "ReferenceError: test is
undefined" exception when trying to check the value of test. This is
however not happening in Firefox browser  built from the same
codebase.

After some debugging, we arrived at the conclusion that our own code
to call  javascript functions on the page is causing some issue.

our code for the same looks some thing like this. This is used to
invoke custom js functions in some pages, but not on on the particular
one that we are having problem with. can you please see if there is
anything wrong with this code and also help us with solving the
problem.



CallJavaScript(const CString&  strJSFnName, const CStringArray&
paramArray, CString&  strRetVal)
{
      try {
            nsresult resultVal = NS_OK;
            nsCOMPtr<nsIDOMDocument>  domDoc;

            if(nsnull == m_webNavigation ) //null check to avoid crash
&  show blank page incase of Webnavigation handle null
            {
                 return false;
            }

            // Get the Document DOM
            resultVal = m_webNavigation-
GetDocument(getter_AddRefs(domDoc));
            if (NS_FAILED(resultVal))
            {
                 return false;
            }

            // Get Document from DOM.
            nsCOMPtr<nsIDocument>  doc = do_QueryInterface(domDoc,
&resultVal);
            if (NS_FAILED(resultVal))
            {
                 return false;
            }

            // Get the Script Global Object from Document

            nsCOMPtr<nsIScriptGlobalObject>  scriptGlobalObj(doc-
GetScriptGlobalObject());
            if (scriptGlobalObj == nsnull) {
                 return false;
            }

            // Get the Script Context
            nsCOMPtr<nsIScriptContext>  scriptContext(scriptGlobalObj-
GetContext());
            if (scriptContext == nsnull) {
                 return false;
            }

            // Get the JSContext.
            JSContext *pJSContext =
reinterpret_cast<JSContext*>(scriptContext->GetNativeContext());
            JSObject *pJSObject = scriptGlobalObj->GetGlobalJSObject();

            {
                 AutoSetupJSContext setupJSContext(pJSContext);

                 jsval jsReturnVal = 0;

                 // Build the Input argument list
                 int argCount =paramArray.GetSize();
                 jsval *pJSInputArgs = new jsval[argCount];

                 for (int argIndex = 0; argIndex<  argCount; +
+argIndex) {
                      CString argStr = paramArray.GetAt(argIndex);
                      jschar *pJSArgChars = (jschar *)
(argStr.GetBuffer(argStr.GetLength()));
                      JSString *jsArgStr =
JS_NewUCStringCopyZ(pJSContext, pJSArgChars);
                      argStr.ReleaseBuffer();
                      pJSInputArgs[argIndex] =
STRING_TO_JSVAL(jsArgStr);
                 }

                 int jsFuncNameLen = WideCharToMultiByte(CP_ACP, 0,
(LPCWSTR)(LPCTSTR)strJSFnName, -1, 0, 0, NULL, NULL);
                 char* pJSFuncName = new char[jsFuncNameLen + 1];
                 WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)
(LPCTSTR)strJSFnName, -1, pJSFuncName, jsFuncNameLen, NULL, NULL);

                 JSBool isJSCallSuccess =
JS_CallFunctionName(pJSContext, pJSObject, pJSFuncName, argCount,
pJSInputArgs,&jsReturnVal);


class AutoSetupJSContext {
public:
      AutoSetupJSContext(JSContext *pJSContext)
                 : m_JSContextStack(), m_pJSContext(pJSContext)
      {
            nsresult resultVal = NS_OK;

            // Get the JSContext Stack.
            m_JSContextStack = do_GetService("@mozilla.org/js/xpc/
ContextStack;1",&resultVal);
            ASSERT(m_JSContextStack != nsnull);

            // Push the JSContext to JSContext Stack.
            resultVal = m_JSContextStack->Push(m_pJSContext);
            ASSERT(resultVal == NS_OK);

            // Set an Error handler on the JSContext. This handler will
get control when ever
            // there is an error with executing a JS Function.
            JS_SetErrorReporter(pJSContext, JSErrorHandler);

            // Begin JS Request. This will ensure that we wait till any
current activity on the
            // JSContext is completed before we do our own.
            JS_BeginRequest(pJSContext);
      }

      ~AutoSetupJSContext(void)
      {
            nsresult resultVal = NS_OK;

            // End the JS Request. We relinquish hold on the JSContext.
            JS_EndRequest(m_pJSContext);

            // Pop the JSContext from stack.
            resultVal = m_JSContextStack->Pop(nsnull);
           ASSERT(resultVal == NS_OK);
      }

private:
      nsCOMPtr<nsIJSContextStack>  m_JSContextStack;
      JSContext *m_pJSContext;
};
_______________________________________________
dev-embedding mailing list
dev-embedding@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-embedding

_______________________________________________
dev-embedding mailing list
dev-embedding@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-embedding

Reply via email to