Exemple #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.JS_GetGlobalObject(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);
        }
Exemple #2
0
        public static IntPtr GetJSContextForDomWindow(nsIDOMWindow window)
        {
            IntPtr context = window.GetWindowRootAttribute().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.JS_GetGlobalObject(cx);
                        if (pGlobal != IntPtr.Zero)
                        {
                            using (var auto = new AutoJSContext(cx))
                            {
                                nsISupports global = auto.GetGlobalNsObject();
                                if (global != null)
                                {
                                    var domWindow = Xpcom.QueryInterface <nsIDOMWindow>(global);
                                    if (domWindow != null)
                                    {
                                        try
                                        {
                                            IntPtr pUnkTest = Marshal.GetIUnknownForObject(domWindow.GetWindowAttribute());
                                            Marshal.Release(pUnkTest);

                                            if (pUnk == pUnkTest)
                                            {
                                                _windowContexts.Add(pUnk, cx);
                                                context = cx;
                                                break;
                                            }
                                        }
                                        finally
                                        {
                                            Marshal.ReleaseComObject(domWindow);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(context);
        }
Exemple #3
0
        public nsISupports GetGlobalNsObject()
        {
            IntPtr globalObject = SpiderMonkey.JS_GetGlobalObject(_cx);

            if (globalObject != IntPtr.Zero)
            {
                Guid guid = typeof(nsISupports).GUID;

                IntPtr pUnk = IntPtr.Zero;
                try
                {
                    pUnk = XPConnect.WrapJS(_cx, globalObject, ref guid);
                    return((nsISupports)Xpcom.GetObjectForIUnknown(pUnk));
                }
                finally
                {
                    if (pUnk != IntPtr.Zero)
                    {
                        Marshal.Release(pUnk);
                    }
                }
            }
            return(null);
        }