Shaka Player Embedded
environment.cc
Go to the documentation of this file.
1 // Copyright 2016 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 
15 #include "src/core/environment.h"
16 
17 #include <glog/logging.h>
18 
19 #include <atomic>
20 #include <string>
21 
24 #include "src/js/base_64.h"
25 #include "src/js/console.h"
26 #include "src/js/debug.h"
27 #include "src/js/dom/attr.h"
29 #include "src/js/dom/comment.h"
31 #include "src/js/dom/document.h"
33 #include "src/js/dom/dom_parser.h"
35 #include "src/js/dom/element.h"
36 #include "src/js/dom/node.h"
37 #include "src/js/dom/text.h"
40 #include "src/js/eme/media_keys.h"
41 #include "src/js/events/event.h"
47 #include "src/js/idb/cursor.h"
48 #include "src/js/idb/database.h"
49 #include "src/js/idb/idb_factory.h"
52 #include "src/js/idb/request.h"
53 #include "src/js/idb/transaction.h"
54 #include "src/js/location.h"
56 #include "src/js/mse/media_error.h"
58 #include "src/js/mse/media_track.h"
60 #include "src/js/mse/text_track.h"
61 #include "src/js/mse/time_ranges.h"
62 #include "src/js/mse/track_list.h"
64 #include "src/js/navigator.h"
65 #include "src/js/test_type.h"
66 #include "src/js/timeouts.h"
67 #include "src/js/url.h"
68 #include "src/js/vtt_cue.h"
70 #include "src/mapping/js_engine.h"
73 
74 namespace shaka {
75 
76 // Defined in generated code by //shaka/tools/gen_eme_plugins.py
78 
79 namespace {
80 
81 void DummyMethod(const CallbackArguments& /* unused */) {}
82 
83 template <typename T, typename Base>
84 void CreateInstance(const std::string& name,
85  BackingObjectFactory<T, Base>* factory) {
86  LocalVar<JsValue> value(factory->WrapInstance(new T));
87  SetMemberRaw(JsEngine::Instance()->global_handle(), name, value);
88 }
89 
90 #if defined(USING_JSC) && !defined(NDEBUG)
91 void GC() {
92  // A global JavaScript method that runs the garbage collector. V8 defines its
93  // own.
94  JSGarbageCollect(JsEngine::Instance()->context());
95 }
96 #endif
97 
98 } // namespace
99 
101  // NOTE: Any base types MUST appear above the derived types.
102 
104 
105 #ifndef NDEBUG
108 #endif
109 
116 
122 
134 
147 
151 
159 };
160 
163 
164 
167 
168  impl_.reset(new Impl);
169 
170  JsEngine* engine = JsEngine::Instance();
171  LocalVar<JsValue> window(engine->global_value());
172  SetMemberRaw(engine->global_handle(), "window", window);
173 
174  // Shaka Player registers an "error" handler on "window".
175  // TODO: Create a global object type so we can have window events.
176  RegisterGlobalFunction("addEventListener", &DummyMethod);
177  RegisterGlobalFunction("removeEventListener", &DummyMethod);
178 
179 #if !defined(NDEBUG) && defined(USING_JSC)
180  RegisterGlobalFunction("gc", &GC);
181 #endif
182 
183  LocalVar<JsValue> document(
184  impl_->document.WrapInstance(js::dom::Document::EnsureGlobalDocument()));
185  SetMemberRaw(JsEngine::Instance()->global_handle(), "document", document);
186 
187  CreateInstance("console", &impl_->console);
188  CreateInstance("location", &impl_->location);
189  CreateInstance("navigator", &impl_->navigator);
190  CreateInstance("indexedDB", &impl_->idb_factory);
191 
194 
195  // Run the script directly since we are initializing, so this is
196  // effectively the event thread.
198  CHECK(RunScript(manager->GetPathForStaticFile("shaka-player.compiled.js")));
199 }
200 
201 
202 #define ADD_GET_FACTORY(type, member) \
203  BackingObjectFactoryBase* type::factory() const { \
204  return BackingObjectFactoryRegistry<type>::CheckedInstance(); \
205  }
206 
207 // \cond Doxygen_Skip
208 ADD_GET_FACTORY(js::Console, console);
209 ADD_GET_FACTORY(js::Debug, debug);
210 ADD_GET_FACTORY(js::Location, location);
211 ADD_GET_FACTORY(js::TestType, test_type);
212 ADD_GET_FACTORY(js::Navigator, navigator);
213 ADD_GET_FACTORY(js::URL, url);
214 ADD_GET_FACTORY(js::VTTCue, vtt_cue);
215 ADD_GET_FACTORY(js::XMLHttpRequest, xml_http_request);
216 
217 ADD_GET_FACTORY(js::mse::AudioTrack, audio_track);
218 ADD_GET_FACTORY(js::mse::AudioTrackList, audio_track_list);
219 ADD_GET_FACTORY(js::mse::MediaError, media_error);
220 ADD_GET_FACTORY(js::mse::MediaSource, media_source);
221 ADD_GET_FACTORY(js::mse::SourceBuffer, source_buffer);
222 ADD_GET_FACTORY(js::mse::TextTrack, text_track);
223 ADD_GET_FACTORY(js::mse::TextTrackList, text_track_list);
224 ADD_GET_FACTORY(js::mse::TimeRanges, time_ranges);
225 ADD_GET_FACTORY(js::mse::HTMLMediaElement, media_element);
226 ADD_GET_FACTORY(js::mse::HTMLVideoElement, video_element);
227 ADD_GET_FACTORY(js::mse::VideoTrack, video_track);
228 ADD_GET_FACTORY(js::mse::VideoTrackList, video_track_list);
229 
230 ADD_GET_FACTORY(js::events::EventTarget, event_target);
231 ADD_GET_FACTORY(js::events::Event, event);
232 ADD_GET_FACTORY(js::events::IDBVersionChangeEvent, version_change_event);
233 ADD_GET_FACTORY(js::events::ProgressEvent, progress_event);
234 ADD_GET_FACTORY(js::events::MediaEncryptedEvent, media_encrypted_event);
235 ADD_GET_FACTORY(js::events::MediaKeyMessageEvent, media_key_message_event);
236 
237 ADD_GET_FACTORY(js::dom::Attr, attr);
238 ADD_GET_FACTORY(js::dom::CharacterData, character_data);
239 ADD_GET_FACTORY(js::dom::Comment, comment);
240 ADD_GET_FACTORY(js::dom::ContainerNode, container_node);
241 ADD_GET_FACTORY(js::dom::Document, document);
242 ADD_GET_FACTORY(js::dom::DOMException, dom_exception);
243 ADD_GET_FACTORY(js::dom::DOMParser, dom_parser);
244 ADD_GET_FACTORY(js::dom::DOMStringList, dom_string_list);
245 ADD_GET_FACTORY(js::dom::Element, element);
246 ADD_GET_FACTORY(js::dom::Node, node);
247 ADD_GET_FACTORY(js::dom::Text, text);
248 
249 ADD_GET_FACTORY(js::eme::MediaKeySession, media_key_session);
250 ADD_GET_FACTORY(js::eme::MediaKeySystemAccess, media_key_system_access);
251 ADD_GET_FACTORY(js::eme::MediaKeys, media_keys);
252 
253 ADD_GET_FACTORY(js::idb::IDBCursor, idb_cursor);
254 ADD_GET_FACTORY(js::idb::IDBDatabase, idb_database);
255 ADD_GET_FACTORY(js::idb::IDBFactory, idb_factory);
256 ADD_GET_FACTORY(js::idb::IDBObjectStore, idb_object_store);
257 ADD_GET_FACTORY(js::idb::IDBRequest, idb_request);
258 ADD_GET_FACTORY(js::idb::IDBOpenDBRequest, idb_open_db_request);
259 ADD_GET_FACTORY(js::idb::IDBTransaction, idb_transaction);
260 // \endcond Doxygen_Skip
261 
262 #undef ADD_GET_FACTORY
263 
264 } // namespace shaka
void RegisterDefaultKeySystems()
js::TestTypeFactory test_type
Definition: environment.cc:107
js::dom::DocumentFactory document
Definition: environment.cc:130
js::mse::MediaSourceFactory media_source
Definition: environment.cc:138
Handle< JsObject > global_handle()
js::mse::AudioTrackListFactory audio_track_list
Definition: environment.cc:136
js::mse::TextTrackFactory text_track
Definition: environment.cc:140
js::dom::ElementFactory element
Definition: environment.cc:127
js::eme::MediaKeysFactory media_keys
Definition: environment.cc:150
js::ConsoleFactory console
Definition: environment.cc:110
js::idb::IDBOpenDBRequestFactory idb_open_db_request
Definition: environment.cc:157
const char * name
js::mse::VideoTrackListFactory video_track_list
Definition: environment.cc:146
js::NavigatorFactory navigator
Definition: environment.cc:112
js::mse::SourceBufferFactory source_buffer
Definition: environment.cc:139
js::events::IDBVersionChangeEventFactory version_change_event
Definition: environment.cc:118
js::dom::NodeFactory node
Definition: environment.cc:123
js::events::MediaEncryptedEventFactory media_encrypted_event
Definition: environment.cc:120
js::DebugFactory debug
Definition: environment.cc:106
bool RunScript(const std::string &path)
Definition: js_wrappers.cc:239
js::mse::TimeRangesFactory time_ranges
Definition: environment.cc:142
ReturnVal< JsValue > global_value()
js::idb::IDBFactoryFactory idb_factory
Definition: environment.cc:154
js::dom::AttrFactory attr
Definition: environment.cc:124
js::idb::IDBObjectStoreFactory idb_object_store
Definition: environment.cc:155
js::mse::TextTrackListFactory text_track_list
Definition: environment.cc:141
js::idb::IDBDatabaseFactory idb_database
Definition: environment.cc:153
js::idb::IDBRequestFactory idb_request
Definition: environment.cc:156
js::XMLHttpRequestFactory xml_http_request
Definition: environment.cc:115
js::mse::VideoTrackFactory video_track
Definition: environment.cc:145
static RefPtr< Document > EnsureGlobalDocument()
Definition: document.cc:51
#define ADD_GET_FACTORY(type, member)
Definition: environment.cc:202
js::idb::IDBCursorFactory idb_cursor
Definition: environment.cc:152
js::dom::ContainerNodeFactory container_node
Definition: environment.cc:125
js::events::ProgressEventFactory progress_event
Definition: environment.cc:119
js::dom::CommentFactory comment
Definition: environment.cc:128
js::events::EventTargetFactory event_target
Definition: environment.cc:103
void SetMemberRaw(Handle< JsObject > object, const std::string &name, Handle< JsValue > value)
Definition: js_wrappers.cc:147
js::VTTCueFactory vtt_cue
Definition: environment.cc:114
js::mse::MediaErrorFactory media_error
Definition: environment.cc:137
void RegisterGlobalFunction(const std::string &name, Func &&callback)
static void Install()
Definition: timeouts.cc:30
js::eme::MediaKeySystemAccessFactory media_key_system_access
Definition: environment.cc:149
js::events::MediaKeyMessageEventFactory media_key_message_event
Definition: environment.cc:121
js::LocationFactory location
Definition: environment.cc:111
js::mse::HTMLMediaElementFactory media_element
Definition: environment.cc:143
js::mse::HTMLVideoElementFactory video_element
Definition: environment.cc:144
js::events::EventFactory event
Definition: environment.cc:117
js::eme::MediaKeySessionFactory media_key_session
Definition: environment.cc:148
js::dom::TextFactory text
Definition: environment.cc:129
js::dom::DOMParserFactory dom_parser
Definition: environment.cc:132
js::mse::AudioTrackFactory audio_track
Definition: environment.cc:135
js::dom::CharacterDataFactory character_data
Definition: environment.cc:126
static void Install()
Definition: base_64.cc:49
std::string GetPathForStaticFile(const std::string &file) const
js::idb::IDBTransactionFactory idb_transaction
Definition: environment.cc:158
js::dom::DOMStringListFactory dom_string_list
Definition: environment.cc:133
js::dom::DOMExceptionFactory dom_exception
Definition: environment.cc:131