forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			132 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* 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/Util.h"
 | |
| 
 | |
| #include "mozilla/dom/ContentParent.h"
 | |
| #include "mozilla/jsipc/ContextWrapperParent.h"
 | |
| 
 | |
| #include "nsAutoPtr.h"
 | |
| 
 | |
| using namespace mozilla;
 | |
| using mozilla::ipc::TestShellParent;
 | |
| using mozilla::ipc::TestShellCommandParent;
 | |
| using mozilla::ipc::PTestShellCommandParent;
 | |
| using mozilla::dom::ContentParent;
 | |
| using mozilla::jsipc::PContextWrapperParent;
 | |
| using mozilla::jsipc::ContextWrapperParent;
 | |
| 
 | |
| PTestShellCommandParent*
 | |
| TestShellParent::AllocPTestShellCommand(const nsString& aCommand)
 | |
| {
 | |
|   return new TestShellCommandParent();
 | |
| }
 | |
| 
 | |
| bool
 | |
| TestShellParent::DeallocPTestShellCommand(PTestShellCommandParent* aActor)
 | |
| {
 | |
|   delete aActor;
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool
 | |
| TestShellParent::CommandDone(TestShellCommandParent* command,
 | |
|                              const nsString& aResponse)
 | |
| {
 | |
|   // XXX what should happen if the callback fails?
 | |
|   /*JSBool ok = */command->RunCallback(aResponse);
 | |
|   command->ReleaseCallback();
 | |
| 
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| PContextWrapperParent*
 | |
| TestShellParent::AllocPContextWrapper()
 | |
| {
 | |
|     ContentParent* cpp = static_cast<ContentParent*>(Manager());
 | |
|     return new ContextWrapperParent(cpp);
 | |
| }
 | |
| 
 | |
| bool
 | |
| TestShellParent::DeallocPContextWrapper(PContextWrapperParent* actor)
 | |
| {
 | |
|     delete actor;
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| JSBool
 | |
| TestShellParent::GetGlobalJSObject(JSContext* cx, JSObject** globalp)
 | |
| {
 | |
|     // TODO Unify this code with TabParent::GetGlobalJSObject.
 | |
|     InfallibleTArray<PContextWrapperParent*> cwps(1);
 | |
|     ManagedPContextWrapperParent(cwps);
 | |
|     if (cwps.Length() < 1)
 | |
|         return JS_FALSE;
 | |
|     NS_ASSERTION(cwps.Length() == 1, "More than one PContextWrapper?");
 | |
|     ContextWrapperParent* cwp = static_cast<ContextWrapperParent*>(cwps[0]);
 | |
|     return cwp->GetGlobalJSObject(cx, globalp);
 | |
| }
 | |
| 
 | |
| JSBool
 | |
| TestShellCommandParent::SetCallback(JSContext* aCx,
 | |
|                                     JS::Value aCallback)
 | |
| {
 | |
|   if (!mCallback.Hold(aCx)) {
 | |
|     return JS_FALSE;
 | |
|   }
 | |
| 
 | |
|   mCallback = aCallback;
 | |
|   mCx = aCx;
 | |
| 
 | |
|   return JS_TRUE;
 | |
| }
 | |
| 
 | |
| JSBool
 | |
| TestShellCommandParent::RunCallback(const nsString& aResponse)
 | |
| {
 | |
|   NS_ENSURE_TRUE(*mCallback.ToJSValPtr() != JSVAL_NULL && mCx, JS_FALSE);
 | |
| 
 | |
|   JSAutoRequest ar(mCx);
 | |
| 
 | |
|   JSObject* global = JS_GetGlobalObject(mCx);
 | |
|   NS_ENSURE_TRUE(global, JS_FALSE);
 | |
| 
 | |
|   JSAutoCompartment ac(mCx, global);
 | |
| 
 | |
|   JSString* str = JS_NewUCStringCopyN(mCx, aResponse.get(), aResponse.Length());
 | |
|   NS_ENSURE_TRUE(str, JS_FALSE);
 | |
| 
 | |
|   JS::Value argv[] = { STRING_TO_JSVAL(str) };
 | |
|   unsigned argc = ArrayLength(argv);
 | |
| 
 | |
|   JS::Value rval;
 | |
|   JSBool ok = JS_CallFunctionValue(mCx, global, mCallback, argc, argv, &rval);
 | |
|   NS_ENSURE_TRUE(ok, JS_FALSE);
 | |
| 
 | |
|   return JS_TRUE;
 | |
| }
 | |
| 
 | |
| void
 | |
| TestShellCommandParent::ReleaseCallback()
 | |
| {
 | |
|   mCallback.Release();
 | |
| }
 | |
| 
 | |
| bool
 | |
| TestShellCommandParent::ExecuteCallback(const nsString& aResponse)
 | |
| {
 | |
|   return static_cast<TestShellParent*>(Manager())->CommandDone(
 | |
|       this, aResponse);
 | |
| }
 | |
| 
 | |
| void
 | |
| TestShellCommandParent::ActorDestroy(ActorDestroyReason why)
 | |
| {
 | |
|   if (why == AbnormalShutdown) {
 | |
|     ExecuteCallback(EmptyString());
 | |
|   }
 | |
| }
 | 
