michael@0: /* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ michael@0: /* vim: set ts=2 et sw=2 tw=80: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "WorkerPrivate.h" michael@0: michael@0: #include "amIAddonManager.h" michael@0: #include "nsIClassInfo.h" michael@0: #include "nsIContentSecurityPolicy.h" michael@0: #include "nsIConsoleService.h" michael@0: #include "nsIDOMDOMException.h" michael@0: #include "nsIDOMEvent.h" michael@0: #include "nsIDOMFile.h" michael@0: #include "nsIDOMMessageEvent.h" michael@0: #include "nsIDocument.h" michael@0: #include "nsIDocShell.h" michael@0: #include "nsIMemoryReporter.h" michael@0: #include "nsIPermissionManager.h" michael@0: #include "nsIScriptError.h" michael@0: #include "nsIScriptGlobalObject.h" michael@0: #include "nsIScriptSecurityManager.h" michael@0: #include "nsPIDOMWindow.h" michael@0: #include "nsITextToSubURI.h" michael@0: #include "nsIThreadInternal.h" michael@0: #include "nsITimer.h" michael@0: #include "nsIURI.h" michael@0: #include "nsIURL.h" michael@0: #include "nsIXPConnect.h" michael@0: michael@0: #include michael@0: #include "jsfriendapi.h" michael@0: #include "js/OldDebugAPI.h" michael@0: #include "js/MemoryMetrics.h" michael@0: #include "mozilla/Assertions.h" michael@0: #include "mozilla/ContentEvents.h" michael@0: #include "mozilla/EventDispatcher.h" michael@0: #include "mozilla/Likely.h" michael@0: #include "mozilla/dom/BindingUtils.h" michael@0: #include "mozilla/dom/ErrorEvent.h" michael@0: #include "mozilla/dom/ErrorEventBinding.h" michael@0: #include "mozilla/dom/Exceptions.h" michael@0: #include "mozilla/dom/FunctionBinding.h" michael@0: #include "mozilla/dom/ImageData.h" michael@0: #include "mozilla/dom/ImageDataBinding.h" michael@0: #include "mozilla/dom/MessageEvent.h" michael@0: #include "mozilla/dom/MessageEventBinding.h" michael@0: #include "mozilla/dom/MessagePortList.h" michael@0: #include "mozilla/dom/WorkerBinding.h" michael@0: #include "mozilla/Preferences.h" michael@0: #include "nsAlgorithm.h" michael@0: #include "nsContentUtils.h" michael@0: #include "nsCxPusher.h" michael@0: #include "nsError.h" michael@0: #include "nsDOMJSUtils.h" michael@0: #include "nsHostObjectProtocolHandler.h" michael@0: #include "nsJSEnvironment.h" michael@0: #include "nsJSUtils.h" michael@0: #include "nsNetUtil.h" michael@0: #include "nsPrintfCString.h" michael@0: #include "nsProxyRelease.h" michael@0: #include "nsSandboxFlags.h" michael@0: #include "xpcpublic.h" michael@0: michael@0: #ifdef ANDROID michael@0: #include michael@0: #endif michael@0: michael@0: #ifdef DEBUG michael@0: #include "nsThreadManager.h" michael@0: #endif michael@0: michael@0: #include "File.h" michael@0: #include "MessagePort.h" michael@0: #include "Navigator.h" michael@0: #include "Principal.h" michael@0: #include "RuntimeService.h" michael@0: #include "ScriptLoader.h" michael@0: #include "SharedWorker.h" michael@0: #include "WorkerFeature.h" michael@0: #include "WorkerRunnable.h" michael@0: #include "WorkerScope.h" michael@0: michael@0: // JS_MaybeGC will run once every second during normal execution. michael@0: #define PERIODIC_GC_TIMER_DELAY_SEC 1 michael@0: michael@0: // A shrinking GC will run five seconds after the last event is processed. michael@0: #define IDLE_GC_TIMER_DELAY_SEC 5 michael@0: michael@0: #define PREF_WORKERS_ENABLED "dom.workers.enabled" michael@0: michael@0: #ifdef WORKER_LOGGING michael@0: #define LOG(_args) do { printf _args ; fflush(stdout); } while (0) michael@0: #else michael@0: #define LOG(_args) do { } while (0) michael@0: #endif michael@0: michael@0: using namespace mozilla; michael@0: using namespace mozilla::dom; michael@0: USING_WORKERS_NAMESPACE michael@0: michael@0: MOZ_DEFINE_MALLOC_SIZE_OF(JsWorkerMallocSizeOf) michael@0: michael@0: #ifdef DEBUG michael@0: michael@0: BEGIN_WORKERS_NAMESPACE michael@0: michael@0: void michael@0: AssertIsOnMainThread() michael@0: { michael@0: MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!"); michael@0: } michael@0: michael@0: END_WORKERS_NAMESPACE michael@0: michael@0: #endif michael@0: michael@0: namespace { michael@0: michael@0: #ifdef DEBUG michael@0: michael@0: const nsIID kDEBUGWorkerEventTargetIID = { michael@0: 0xccaba3fa, 0x5be2, 0x4de2, { 0xba, 0x87, 0x3b, 0x3b, 0x5b, 0x1d, 0x5, 0xfb } michael@0: }; michael@0: michael@0: #endif michael@0: michael@0: template michael@0: class AutoPtrComparator michael@0: { michael@0: typedef nsAutoPtr A; michael@0: typedef T* B; michael@0: michael@0: public: michael@0: bool Equals(const A& a, const B& b) const { michael@0: return a && b ? *a == *b : !a && !b ? true : false; michael@0: } michael@0: bool LessThan(const A& a, const B& b) const { michael@0: return a && b ? *a < *b : b ? true : false; michael@0: } michael@0: }; michael@0: michael@0: template michael@0: inline AutoPtrComparator michael@0: GetAutoPtrComparator(const nsTArray >&) michael@0: { michael@0: return AutoPtrComparator(); michael@0: } michael@0: michael@0: // Specialize this if there's some class that has multiple nsISupports bases. michael@0: template michael@0: struct ISupportsBaseInfo michael@0: { michael@0: typedef T ISupportsBase; michael@0: }; michael@0: michael@0: template