From 5f8de423f190bbb79a62f804151bc24824fa32d8 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Fri, 2 Feb 2018 04:16:08 -0500 Subject: Add m-esr52 at 52.6.0 --- ipc/testshell/TestShellParent.cpp | 109 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 ipc/testshell/TestShellParent.cpp (limited to 'ipc/testshell/TestShellParent.cpp') diff --git a/ipc/testshell/TestShellParent.cpp b/ipc/testshell/TestShellParent.cpp new file mode 100644 index 000000000..f0c851101 --- /dev/null +++ b/ipc/testshell/TestShellParent.cpp @@ -0,0 +1,109 @@ +/* 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 "jsfriendapi.h" +#include "mozilla/ArrayUtils.h" + +#include "mozilla/dom/ContentParent.h" +#include "mozilla/dom/ScriptSettings.h" + +#include "xpcpublic.h" + +using namespace mozilla; +using mozilla::ipc::TestShellParent; +using mozilla::ipc::TestShellCommandParent; +using mozilla::ipc::PTestShellCommandParent; +using mozilla::dom::ContentParent; + +void +TestShellParent::ActorDestroy(ActorDestroyReason aWhy) +{ + // Implement me! Bug 1005177 +} + +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, + const JS::Value& aCallback) +{ + if (!mCallback.initialized()) { + mCallback.init(aCx, aCallback); + return true; + } + + mCallback = aCallback; + + return true; +} + +bool +TestShellCommandParent::RunCallback(const nsString& aResponse) +{ + NS_ENSURE_TRUE(mCallback.isObject(), false); + + // We're about to run script via JS_CallFunctionValue, so we need an + // AutoEntryScript. This is just for testing and not in any spec. + dom::AutoEntryScript aes(&mCallback.toObject(), "TestShellCommand"); + JSContext* cx = aes.cx(); + JS::Rooted global(cx, JS::CurrentGlobalOrNull(cx)); + + JSString* str = JS_NewUCStringCopyN(cx, aResponse.get(), aResponse.Length()); + NS_ENSURE_TRUE(str, false); + + JS::Rooted strVal(cx, JS::StringValue(str)); + + JS::Rooted rval(cx); + JS::Rooted callback(cx, mCallback); + bool ok = JS_CallFunctionValue(cx, global, callback, JS::HandleValueArray(strVal), &rval); + NS_ENSURE_TRUE(ok, false); + + return true; +} + +void +TestShellCommandParent::ReleaseCallback() +{ + mCallback.reset(); +} + +bool +TestShellCommandParent::ExecuteCallback(const nsString& aResponse) +{ + return static_cast(Manager())->CommandDone( + this, aResponse); +} + +void +TestShellCommandParent::ActorDestroy(ActorDestroyReason why) +{ + if (why == AbnormalShutdown) { + ExecuteCallback(EmptyString()); + } +} -- cgit v1.2.3