File: ExtensionMockAPI.cpp

package info (click to toggle)
thunderbird 1%3A91.12.0-1~deb10u1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 3,008,300 kB
  • sloc: cpp: 6,084,052; javascript: 4,790,441; ansic: 3,341,486; python: 862,958; asm: 366,542; xml: 204,277; java: 152,477; sh: 111,376; makefile: 21,388; perl: 15,312; yacc: 4,583; objc: 3,026; lex: 1,720; exp: 762; pascal: 635; awk: 564; sql: 453; php: 436; lisp: 432; ruby: 99; sed: 69; csh: 45
file content (113 lines) | stat: -rw-r--r-- 3,579 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 "ExtensionMockAPI.h"
#include "ExtensionEventManager.h"

#include "mozilla/dom/ExtensionMockAPIBinding.h"
#include "mozilla/extensions/ExtensionPort.h"
#include "nsIGlobalObject.h"

namespace mozilla {
namespace extensions {

NS_IMPL_CYCLE_COLLECTING_ADDREF(ExtensionMockAPI);
NS_IMPL_CYCLE_COLLECTING_RELEASE(ExtensionMockAPI)
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(ExtensionMockAPI, mGlobal,
                                      mOnTestEventMgr);

NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ExtensionMockAPI)
  NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
  NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END

ExtensionMockAPI::ExtensionMockAPI(nsIGlobalObject* aGlobal,
                                   ExtensionBrowser* aExtensionBrowser)
    : mGlobal(aGlobal) {
  MOZ_DIAGNOSTIC_ASSERT(mGlobal);
}

/* static */
bool ExtensionMockAPI::IsAllowed(JSContext* aCx, JSObject* aGlobal) {
  return true;
}

JSObject* ExtensionMockAPI::WrapObject(JSContext* aCx,
                                       JS::Handle<JSObject*> aGivenProto) {
  return dom::ExtensionMockAPI_Binding::Wrap(aCx, this, aGivenProto);
}

nsIGlobalObject* ExtensionMockAPI::GetParentObject() const { return mGlobal; }

void ExtensionMockAPI::GetPropertyAsErrorObject(
    JSContext* aCx, JS::MutableHandle<JS::Value> aRetval) {
  IgnoredErrorResult rv;
  RefPtr<ExtensionAPIGetProperty> request =
      GetProperty(u"propertyAsErrorObject"_ns);
  request->Run(mGlobal, aCx, aRetval, rv);
  if (rv.Failed()) {
    NS_WARNING("ExtensionMockAPI::GetPropertyAsErrorObject failure");
    return;
  }
}

void ExtensionMockAPI::GetPropertyAsString(DOMString& aRetval) {
  IgnoredErrorResult rv;

  dom::AutoJSAPI jsapi;
  if (!jsapi.Init(GetParentObject())) {
    NS_WARNING("ExtensionMockAPI::GetPropertyAsId fail to init jsapi");
  }

  JSContext* cx = jsapi.cx();
  JS::RootedValue retval(cx);

  RefPtr<ExtensionAPIGetProperty> request =
      GetProperty(u"getPropertyAsString"_ns);
  request->Run(mGlobal, cx, &retval, rv);
  if (rv.Failed()) {
    NS_WARNING("ExtensionMockAPI::GetPropertyAsString failure");
    return;
  }
  nsAutoJSString strRetval;
  if (!retval.isString() || !strRetval.init(cx, retval)) {
    NS_WARNING("ExtensionMockAPI::GetPropertyAsString got a non string result");
    return;
  }
  aRetval.SetKnownLiveString(strRetval);
}

ExtensionEventManager* ExtensionMockAPI::OnTestEvent() {
  if (!mOnTestEventMgr) {
    mOnTestEventMgr = CreateEventManager(u"onTestEvent"_ns);
  }

  return mOnTestEventMgr;
}

already_AddRefed<ExtensionPort> ExtensionMockAPI::CallWebExtMethodReturnsPort(
    JSContext* aCx, const nsAString& aApiMethod,
    const dom::Sequence<JS::Value>& aArgs, ErrorResult& aRv) {
  JS::Rooted<JS::Value> apiResult(aCx);
  auto request = CallSyncFunction(u"methodReturnsPort"_ns);
  request->Run(mGlobal, aCx, aArgs, &apiResult, aRv);
  if (NS_WARN_IF(aRv.Failed())) {
    return nullptr;
  }

  IgnoredErrorResult rv;
  RefPtr<ExtensionPort> port = ExtensionPort::Create(mGlobal, apiResult, rv);
  if (NS_WARN_IF(rv.Failed())) {
    // ExtensionPort::Create doesn't throw the js exception with the generic
    // error message as the "api request forwarding" helper classes.
    ThrowUnexpectedError(aCx, aRv);
    return nullptr;
  }

  return port.forget();
}

}  // namespace extensions
}  // namespace mozilla