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 "Activity.h" michael@0: michael@0: #include "nsContentUtils.h" michael@0: #include "nsDOMClassInfo.h" michael@0: #include "nsIConsoleService.h" michael@0: #include "nsIDocShell.h" michael@0: #include "nsIDocument.h" michael@0: michael@0: using namespace mozilla::dom; michael@0: michael@0: NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(Activity) michael@0: NS_INTERFACE_MAP_END_INHERITING(DOMRequest) michael@0: michael@0: NS_IMPL_ADDREF_INHERITED(Activity, DOMRequest) michael@0: NS_IMPL_RELEASE_INHERITED(Activity, DOMRequest) michael@0: michael@0: NS_IMPL_CYCLE_COLLECTION_INHERITED(Activity, DOMRequest, michael@0: mProxy) michael@0: michael@0: NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(Activity, DOMRequest) michael@0: NS_IMPL_CYCLE_COLLECTION_TRACE_END michael@0: michael@0: /* virtual */ JSObject* michael@0: Activity::WrapObject(JSContext* aCx) michael@0: { michael@0: return MozActivityBinding::Wrap(aCx, this); michael@0: } michael@0: michael@0: nsresult michael@0: Activity::Initialize(nsPIDOMWindow* aWindow, michael@0: JSContext* aCx, michael@0: const ActivityOptions& aOptions) michael@0: { michael@0: MOZ_ASSERT(aWindow); michael@0: michael@0: nsCOMPtr document = aWindow->GetExtantDoc(); michael@0: michael@0: bool isActive; michael@0: aWindow->GetDocShell()->GetIsActive(&isActive); michael@0: michael@0: if (!isActive && michael@0: !nsContentUtils::IsChromeDoc(document)) { michael@0: nsCOMPtr rs = michael@0: do_GetService("@mozilla.org/dom/dom-request-service;1"); michael@0: rs->FireErrorAsync(static_cast(this), michael@0: NS_LITERAL_STRING("NotUserInput")); michael@0: michael@0: nsCOMPtr console( michael@0: do_GetService("@mozilla.org/consoleservice;1")); michael@0: NS_ENSURE_TRUE(console, NS_OK); michael@0: michael@0: nsString message = michael@0: NS_LITERAL_STRING("Can only start activity from user input or chrome code"); michael@0: console->LogStringMessage(message.get()); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: // Instantiate a JS proxy that will do the child <-> parent communication michael@0: // with the JS implementation of the backend. michael@0: nsresult rv; michael@0: mProxy = do_CreateInstance("@mozilla.org/dom/activities/proxy;1", &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: JS::Rooted optionsValue(aCx); michael@0: if (!aOptions.ToObject(aCx, &optionsValue)) { michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: mProxy->StartActivity(static_cast(this), optionsValue, aWindow); michael@0: return NS_OK; michael@0: } michael@0: michael@0: Activity::~Activity() michael@0: { michael@0: if (mProxy) { michael@0: mProxy->Cleanup(); michael@0: } michael@0: } michael@0: michael@0: Activity::Activity(nsPIDOMWindow* aWindow) michael@0: : DOMRequest(aWindow) michael@0: { michael@0: MOZ_ASSERT(IsDOMBinding()); michael@0: } michael@0: