diff -r 000000000000 -r 6474c204b198 dom/activities/src/Activity.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/activities/src/Activity.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,90 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "Activity.h" + +#include "nsContentUtils.h" +#include "nsDOMClassInfo.h" +#include "nsIConsoleService.h" +#include "nsIDocShell.h" +#include "nsIDocument.h" + +using namespace mozilla::dom; + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(Activity) +NS_INTERFACE_MAP_END_INHERITING(DOMRequest) + +NS_IMPL_ADDREF_INHERITED(Activity, DOMRequest) +NS_IMPL_RELEASE_INHERITED(Activity, DOMRequest) + +NS_IMPL_CYCLE_COLLECTION_INHERITED(Activity, DOMRequest, + mProxy) + +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(Activity, DOMRequest) +NS_IMPL_CYCLE_COLLECTION_TRACE_END + +/* virtual */ JSObject* +Activity::WrapObject(JSContext* aCx) +{ + return MozActivityBinding::Wrap(aCx, this); +} + +nsresult +Activity::Initialize(nsPIDOMWindow* aWindow, + JSContext* aCx, + const ActivityOptions& aOptions) +{ + MOZ_ASSERT(aWindow); + + nsCOMPtr document = aWindow->GetExtantDoc(); + + bool isActive; + aWindow->GetDocShell()->GetIsActive(&isActive); + + if (!isActive && + !nsContentUtils::IsChromeDoc(document)) { + nsCOMPtr rs = + do_GetService("@mozilla.org/dom/dom-request-service;1"); + rs->FireErrorAsync(static_cast(this), + NS_LITERAL_STRING("NotUserInput")); + + nsCOMPtr console( + do_GetService("@mozilla.org/consoleservice;1")); + NS_ENSURE_TRUE(console, NS_OK); + + nsString message = + NS_LITERAL_STRING("Can only start activity from user input or chrome code"); + console->LogStringMessage(message.get()); + + return NS_OK; + } + + // Instantiate a JS proxy that will do the child <-> parent communication + // with the JS implementation of the backend. + nsresult rv; + mProxy = do_CreateInstance("@mozilla.org/dom/activities/proxy;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); + + JS::Rooted optionsValue(aCx); + if (!aOptions.ToObject(aCx, &optionsValue)) { + return NS_ERROR_FAILURE; + } + + mProxy->StartActivity(static_cast(this), optionsValue, aWindow); + return NS_OK; +} + +Activity::~Activity() +{ + if (mProxy) { + mProxy->Cleanup(); + } +} + +Activity::Activity(nsPIDOMWindow* aWindow) + : DOMRequest(aWindow) +{ + MOZ_ASSERT(IsDOMBinding()); +} +