| 218 | } |
| 219 | |
| 220 | Local<Value> CreateExternalWinRTObject(const char* ns, |
| 221 | const char* objectName, |
| 222 | ::Platform::Object ^ instance) { |
| 223 | EscapableHandleScope scope; |
| 224 | Handle<Value> opaqueWrapper = CreateOpaqueWrapper(instance); |
| 225 | |
| 226 | Local<Object> global = Nan::GetCurrentContext()->Global(); |
| 227 | if (!Nan::Has(global, |
| 228 | Nan::New<String>("__winRtNamespaces__").ToLocalChecked()) |
| 229 | .FromMaybe(false)) { |
| 230 | return scope.Escape(opaqueWrapper); |
| 231 | } |
| 232 | |
| 233 | Local<Object> winRtObj = |
| 234 | Nan::To<Object>( |
| 235 | Nan::Get(global, |
| 236 | Nan::New<String>("__winRtNamespaces__").ToLocalChecked()) |
| 237 | .ToLocalChecked()) |
| 238 | .ToLocalChecked(); |
| 239 | |
| 240 | Local<String> nsSymbol = Nan::New<String>(ns).ToLocalChecked(); |
| 241 | if (!Nan::Has(winRtObj, nsSymbol).FromMaybe(false)) { |
| 242 | return scope.Escape(opaqueWrapper); |
| 243 | } |
| 244 | |
| 245 | v8::MaybeLocal<Value> maybeLocalRef = Nan::Get(winRtObj, nsSymbol); |
| 246 | |
| 247 | if (maybeLocalRef.IsEmpty()) { |
| 248 | return scope.Escape(opaqueWrapper); |
| 249 | } |
| 250 | |
| 251 | Local<Value> nsObjectValue = maybeLocalRef.ToLocalChecked(); |
| 252 | |
| 253 | if (Nan::Equals(nsObjectValue, Undefined()).FromMaybe(false)) { |
| 254 | Nan::ThrowError(Nan::Error(NodeRT::Utils::NewString( |
| 255 | L"Failed to obtain external namespace object"))); |
| 256 | return Undefined(); |
| 257 | } |
| 258 | |
| 259 | Local<Object> nsObject = Nan::To<Object>(nsObjectValue).ToLocalChecked(); |
| 260 | |
| 261 | Local<String> objectNameSymbol = |
| 262 | Nan::New<String>(objectName).ToLocalChecked(); |
| 263 | if (!Nan::Has(nsObject, objectNameSymbol).FromMaybe(false)) { |
| 264 | return scope.Escape(opaqueWrapper); |
| 265 | } |
| 266 | |
| 267 | Local<Function> objectFunc = |
| 268 | Nan::Get(nsObject, objectNameSymbol).ToLocalChecked().As<Function>(); |
| 269 | Local<Value> args[] = {opaqueWrapper}; |
| 270 | return scope.Escape( |
| 271 | Nan::NewInstance(objectFunc, _countof(args), args).ToLocalChecked()); |
| 272 | } |
| 273 | |
| 274 | bool IsWinRtWrapper(Local<Value> value) { |
| 275 | if (value.IsEmpty() || (!value->IsObject() && !value->IsNull())) { |
nothing calls this directly
no test coverage detected