Shaka Player Embedded
js_object_wrapper.cc
Go to the documentation of this file.
1 // Copyright 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
16 
18 
19 namespace shaka {
20 
23 
24 void JsObjectWrapper::Init(Handle<JsObject> object) {
25  object_ = object;
26 }
27 
28 Error JsObjectWrapper::ConvertError(Handle<JsValue> except) {
29  if (!IsObject(except))
30  return Error(ConvertToString(except));
31 
32  LocalVar<JsObject> obj = UnsafeJsCast<JsObject>(except);
33  LocalVar<JsValue> message_member = GetMemberRaw(obj, "message");
34  // Rather than checking for the type of the exception, assume that if it has
35  // a 'name' field, then it is an exception.
36  LocalVar<JsValue> name_member = GetMemberRaw(obj, "name");
37  if (!IsNullOrUndefined(name_member)) {
38  const std::string message =
39  ConvertToString(name_member) + ": " + ConvertToString(message_member);
40  return Error(message);
41  }
42 
43  LocalVar<JsValue> code = GetMemberRaw(obj, "code");
44  LocalVar<JsValue> category = GetMemberRaw(obj, "category");
47  return Error(ConvertToString(except));
48  }
49 
50  LocalVar<JsValue> severity_val = GetMemberRaw(obj, "severity");
51  int severity = 0;
52  if (GetValueType(severity_val) == proto::ValueType::Number)
53  severity = static_cast<int>(NumberFromValue(severity_val));
54 
55  std::string message;
56  if (IsNullOrUndefined(message_member)) {
57  message = "Shaka Error, Category: " + ConvertToString(category) +
58  ", Code: " + ConvertToString(code);
59  } else {
60  message = ConvertToString(message_member);
61  }
62  return Error(severity, static_cast<int>(NumberFromValue(category)),
63  static_cast<int>(NumberFromValue(code)), message);
64 }
65 
68  const std::string& name, std::function<void(const Error&)> on_error,
69  std::function<void(Handle<JsObject> event)> handler) const {
70  auto callback = [=](optional<Any> event) {
71  // We can't accept or use events::Event since Shaka player raises fake
72  // events. So manually look for the properties.
73  LocalVar<JsValue> event_val = ToJsValue(event);
74  if (!IsObject(event_val)) {
75  on_error(Error(ConvertToString(event_val)));
76  return;
77  }
78 
79  LocalVar<JsObject> event_obj = UnsafeJsCast<JsObject>(event_val);
80  handler(event_obj);
81  };
82  LocalVar<JsFunction> callback_js =
83  CreateStaticFunction("", "", std::move(callback));
84  LocalVar<JsValue> arguments[] = {ToJsValue(name), RawToJsValue(callback_js)};
85  return CallMemberFunction(object_, "addEventListener", 2, arguments, nullptr);
86 }
87 
90  const std::string& name, int argc,
91  LocalVar<JsValue>* argv,
92  LocalVar<JsValue>* result) {
93  LocalVar<JsValue> member = GetMemberRaw(that, name);
95  return Error("The member '" + name + "' is not a function.");
96  }
97 
98  LocalVar<JsValue> result_or_except;
99  LocalVar<JsFunction> member_func = UnsafeJsCast<JsFunction>(member);
100  if (!InvokeMethod(member_func, that, argc, argv, &result_or_except)) {
101  return ConvertError(result_or_except);
102  }
103 
104  if (result)
105  *result = result_or_except;
106  return monostate();
107 }
108 
109 } // namespace shaka
ReturnVal< JsFunction > CreateStaticFunction(const std::string &target, const std::string &name, Func &&callback)
typename AsyncResults< Ret >::variant_type variant_type
bool IsObject(Handle< JsValue > value)
Definition: js_wrappers.cc:315
bool IsNullOrUndefined(Handle< JsValue > value)
Definition: js_wrappers.cc:311
bool InvokeMethod(Handle< JsFunction > method, Handle< JsObject > that, int argc, LocalVar< JsValue > *argv, LocalVar< JsValue > *result_or_except)
Definition: js_wrappers.cc:182
const char * name
ReturnVal< JsValue > ToJsValue(T &&source)
Definition: convert_js.h:381
Global< JsObject > object_
static Converter< void >::variant_type CallMemberFunction(Handle< JsObject > that, const std::string &name, int argc, LocalVar< JsValue > *argv, LocalVar< JsValue > *result)
ReturnVal< JsValue > RawToJsValue(Handle< T > source)
Definition: js_wrappers.h:405
proto::ValueType GetValueType(Handle< JsValue > value)
Definition: js_wrappers.cc:329
double NumberFromValue(Handle< JsValue > value)
Definition: js_wrappers.cc:385
Converter< void >::variant_type AttachEventListener(const std::string &name, std::function< void(const Error &)> on_error, std::function< void(Handle< JsObject > event)> handler) const
std::string ConvertToString(Handle< JsValue > value)
Definition: js_wrappers.cc:203
static Error ConvertError(Handle< JsValue > except)
const char * message
void Init(Handle< JsObject > object)
ReturnVal< JsValue > GetMemberRaw(Handle< JsObject > object, const std::string &name, LocalVar< JsValue > *exception=nullptr)
Definition: js_wrappers.cc:136