private static IntPtr GetContextByName(string contextName) { Xpcom.AssertCorrectThread(); IntPtr rt = Runtime; IntPtr iterp = IntPtr.Zero; IntPtr cx; while ((cx = SpiderMonkey.JS_ContextIterator(rt, ref iterp)) != IntPtr.Zero) { IntPtr global = SpiderMonkey.DefaultObjectForContextOrNull(cx); if (global != IntPtr.Zero) { IntPtr classp = SpiderMonkey.JS_GetClass(global); // get class name if (classp != IntPtr.Zero) { string className = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(classp)); if (className == contextName) { return(cx); } } } } return(IntPtr.Zero); }
/// <summary> /// Helper method which attempts to find the global object in a Context. /// </summary> /// <returns>the Global object ptr or Null/Zero ptr if not found.</returns> private IntPtr GetGlobalFromContext(IntPtr context) { IntPtr globalObject = SpiderMonkey.CurrentGlobalOrNull(context); if (globalObject == IntPtr.Zero) { globalObject = SpiderMonkey.DefaultObjectForContextOrNull(context); if (globalObject == IntPtr.Zero) { return(IntPtr.Zero); } } return(globalObject); }
/// <summary> /// Create a AutoJSContext using the SafeJSContext. /// If context is IntPtr.Zero use the SafeJSContext /// </summary> /// <param name="context"></param> public AutoJSContext(IntPtr context) { // We can't just use nsIXPConnect::GetSafeJSContext(); because its marked as [noxpcom, nostdcall] // TODO: Enhance IDL compiler to not generate methods for noxpcom, nostdcall tagged methods. if (context == IntPtr.Zero) { context = GlobalJSContextHolder.SafeJSContext; } IntPtr globalObject = SpiderMonkey.CurrentGlobalOrNull(context); if (globalObject == IntPtr.Zero) { globalObject = SpiderMonkey.DefaultObjectForContextOrNull(context); if (globalObject == IntPtr.Zero) { throw new InvalidOperationException("JSContext don't store their default compartment object on the cx."); } _defaultCompartment = new JSAutoCompartment(context, globalObject); } _cx = context; }
internal static IntPtr GetJSContextForDomWindow(nsIDOMWindow window) { IntPtr context = IntPtr.Zero; nsIDOMEventTarget eventTarget = window.GetWindowRootAttribute(); try { context = eventTarget.GetJSContextForEventHandlers(); if (context == IntPtr.Zero) { IntPtr pUnk = Marshal.GetIUnknownForObject(window); Marshal.Release(pUnk); if (!_windowContexts.TryGetValue(pUnk, out context)) { context = IntPtr.Zero; IntPtr cx; IntPtr iterp = IntPtr.Zero; IntPtr rt = Runtime; while ((cx = SpiderMonkey.JS_ContextIterator(rt, ref iterp)) != IntPtr.Zero) { IntPtr pGlobal = SpiderMonkey.DefaultObjectForContextOrNull(cx); if (pGlobal != IntPtr.Zero) { using (var auto = new AutoJSContext(cx)) { using (ComPtr <nsISupports> global = auto.GetGlobalNsObject()) { if (global != null) { var domWindow = Xpcom.QueryInterface <nsIDOMWindow>(global.Instance); if (domWindow != null) { try { IntPtr pUnkTest = Marshal.GetIUnknownForObject(domWindow.GetWindowAttribute()); Marshal.Release(pUnkTest); if (pUnk == pUnkTest) { _windowContexts.Add(pUnk, cx); context = cx; break; } } finally { Xpcom.FreeComObject(ref domWindow); } } } } } } } } } } finally { if (eventTarget != null) { Xpcom.FreeComObject(ref eventTarget); } } return(context); }