NS_IMETHODIMP
nsEventListenerInfo::ToSource(nsAString& aResult)
{
  aResult.SetIsVoid(true);

  nsCOMPtr<nsIThreadJSContextStack> stack =
    nsContentUtils::ThreadJSContextStack();
  if (stack) {
    JSContext* cx = stack->GetSafeJSContext();
    if (cx && NS_SUCCEEDED(stack->Push(cx))) {
      {
        // Extra block to finish the auto request before calling pop
        JSAutoRequest ar(cx);
        mozilla::Maybe<JSAutoCompartment> ac;
        jsval v = JSVAL_NULL;
        if (GetJSVal(cx, ac, &v)) {
          JSString* str = JS_ValueToSource(cx, v);
          if (str) {
            nsDependentJSString depStr;
            if (depStr.init(cx, str)) {
              aResult.Assign(depStr);
            }
          }
        }
      }
      stack->Pop(&cx);
    }
  }
  
  return NS_OK;
}
Example #2
0
/* Mimick the behaviour exposed by standard Error objects
   (http://mxr.mozilla.org/mozilla-central/source/js/src/jsexn.cpp#554)
*/
static char*
jsvalue_to_string(JSContext* cx, jsval val, gboolean* is_string)
{
    char* value = NULL;
    JSString* value_str = NULL;

    if (JSVAL_IS_PRIMITIVE(val)) {
      value_str = JS_ValueToSource(cx, val);
    } else {
      JSObject *obj = JSVAL_TO_OBJECT(val);

      if (JS_ObjectIsFunction(cx, obj)) {
	JSFunction *fn = JS_ValueToFunction(cx, val);
	value_str = JS_GetFunctionId(fn);

	if (!value_str)
	  value = g_strdup("[unknown function]");
      } else {
	value = g_strdup_printf("[object %s]", JS_GetClass(cx, obj)->name);
      }
    }

    if (!value && value_str)
      value = gjs_value_debug_string(cx, val);

    if (is_string)
        *is_string = JSVAL_IS_STRING(val);

    return value;
}
NS_IMETHODIMP
nsEventListenerInfo::ToSource(nsAString& aResult)
{
  aResult.SetIsVoid(PR_TRUE);

  nsresult rv;
  jsval v = JSVAL_NULL;
  nsAutoGCRoot root(&v, &rv);
  NS_ENSURE_SUCCESS(rv, rv);

  if (GetJSVal(&v)) {
    nsCOMPtr<nsIThreadJSContextStack> stack =
      nsContentUtils::ThreadJSContextStack();
    if (stack) {
      JSContext* cx = nsnull;
      stack->GetSafeJSContext(&cx);
      if (cx && NS_SUCCEEDED(stack->Push(cx))) {
        JSAutoRequest ar(cx);
        JSString* str = JS_ValueToSource(cx, v);
        if (str) {
          aResult.Assign(nsDependentJSString(str));
        }
        stack->Pop(&cx);
      }
    }
  }

  return NS_OK;
}
NS_IMETHODIMP
EventListenerInfo::ToSource(nsAString& aResult)
{
  aResult.SetIsVoid(true);

  AutoSafeJSContext cx;
  Maybe<JSAutoCompartment> ac;
  JS::Rooted<JS::Value> v(cx);
  if (GetJSVal(cx, ac, &v)) {
    JSString* str = JS_ValueToSource(cx, v);
    if (str) {
      nsAutoJSString autoStr;
      if (autoStr.init(cx, str)) {
        aResult.Assign(autoStr);
      }
    }
  }
  return NS_OK;
}
Example #5
0
void afx_cmd() {
	if(!g_JsRunning) {
		pEngfuncs->Con_Printf("Error: script engine not running.\n");
		return;
	}

	int argc = pEngfuncs->Cmd_Argc();

	if(argc < 2) {
		// Print help and return:
		pEngfuncs->Con_Printf(
			"Usage: afx <script command(s)>\n"
		);
		return;
	}

	//
	// concat arguments to full string:

	char *ttt, *ct;
	unsigned int len=0;

	// calculate required space:
	for(int i=0; i<argc; i++) len += strlen(pEngfuncs->Cmd_Argv(i))+1;
	if(len<1) len=1;

	ct = ttt = (char *)malloc(sizeof(char)*len);

	if(!ct) {
		pEngfuncs->Con_Printf("ERROR: malloc failed.\n");
		return;
	}

	for(int i=1; i<argc; i++) {
		char const * cur = pEngfuncs->Cmd_Argv(i);
		unsigned int lcur = strlen(cur);
		
		if(1<i) {
			*ct = ' ';
			ct++;
			len--;
		}

		strcpy_s(ct, len, cur);
		ct += lcur;
		len -= lcur;
	}
	*ct = 0; // Term

	jsval rval;
	JSBool ok;
	JSAutoCompartment ac(g_JsCx, g_JsGlobal);

	pEngfuncs->Con_DPrintf("%s\n", ttt);
	ok = JS_EvaluateScript(g_JsCx, JS_GetGlobalForScopeChain(g_JsCx), ttt, strlen(ttt), NULL, 0, &rval);

	if(!ok)
		pEngfuncs->Con_Printf("Error.\n");
	else if (!JSVAL_IS_VOID(rval)) 
	{
		JSString *str = JS_ValueToSource(g_JsCx, rval);
		if(str)
		{
			char *c_str = JS_EncodeString(g_JsCx, str);
			if(c_str)
			{
				pEngfuncs->Con_Printf("Result: %s\n", c_str);
				JS_free(g_JsCx, c_str);
			}
		}
		else
			pEngfuncs->Con_Printf("Result error.\n");
	}

	free(ttt);
}