Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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;
        }
Ejemplo n.º 4
0
        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);
        }