diff -r 000000000000 -r 6474c204b198 ipc/testshell/TestShellParent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ipc/testshell/TestShellParent.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,102 @@ +/* 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 "TestShellParent.h" + +/* This must occur *after* TestShellParent.h to avoid typedefs conflicts. */ +#include "mozilla/ArrayUtils.h" + +#include "mozilla/dom/ContentParent.h" + +#include "nsAutoPtr.h" +#include "nsCxPusher.h" + +using namespace mozilla; +using mozilla::ipc::TestShellParent; +using mozilla::ipc::TestShellCommandParent; +using mozilla::ipc::PTestShellCommandParent; +using mozilla::dom::ContentParent; + +PTestShellCommandParent* +TestShellParent::AllocPTestShellCommandParent(const nsString& aCommand) +{ + return new TestShellCommandParent(); +} + +bool +TestShellParent::DeallocPTestShellCommandParent(PTestShellCommandParent* aActor) +{ + delete aActor; + return true; +} + +bool +TestShellParent::CommandDone(TestShellCommandParent* command, + const nsString& aResponse) +{ + // XXX what should happen if the callback fails? + /*bool ok = */command->RunCallback(aResponse); + command->ReleaseCallback(); + + return true; +} + +bool +TestShellCommandParent::SetCallback(JSContext* aCx, + JS::Value aCallback) +{ + if (!mCallback.Hold(aCx)) { + return false; + } + + mCallback = aCallback; + mCx = aCx; + + return true; +} + +bool +TestShellCommandParent::RunCallback(const nsString& aResponse) +{ + NS_ENSURE_TRUE(!mCallback.get().isNull() && mCx, false); + + // We're pulling a cx off the heap, so make sure it's stack-top. + AutoCxPusher pusher(mCx); + NS_ENSURE_TRUE(mCallback.ToJSObject(), false); + JSAutoCompartment ac(mCx, mCallback.ToJSObject()); + JS::Rooted global(mCx, JS::CurrentGlobalOrNull(mCx)); + + JSString* str = JS_NewUCStringCopyN(mCx, aResponse.get(), aResponse.Length()); + NS_ENSURE_TRUE(str, false); + + JS::Rooted strVal(mCx, JS::StringValue(str)); + + JS::Rooted rval(mCx); + JS::Rooted callback(mCx, mCallback); + bool ok = JS_CallFunctionValue(mCx, global, callback, strVal, &rval); + NS_ENSURE_TRUE(ok, false); + + return true; +} + +void +TestShellCommandParent::ReleaseCallback() +{ + mCallback.Release(); +} + +bool +TestShellCommandParent::ExecuteCallback(const nsString& aResponse) +{ + return static_cast(Manager())->CommandDone( + this, aResponse); +} + +void +TestShellCommandParent::ActorDestroy(ActorDestroyReason why) +{ + if (why == AbnormalShutdown) { + ExecuteCallback(EmptyString()); + } +}