Serenity Operating System
at master 78 lines 2.4 kB view raw
1/* 2 * Copyright (c) 2022, Andrew Kaster <akaster@serenityos.org> 3 * Copyright (c) 2022, Linus Groh <linusg@serenityos.org> 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#include <LibJS/Heap/Heap.h> 9#include <LibJS/Runtime/Realm.h> 10#include <LibWeb/Bindings/Intrinsics.h> 11#include <LibWeb/HTML/Navigator.h> 12#include <LibWeb/HTML/Scripting/Environments.h> 13#include <LibWeb/HTML/Window.h> 14#include <LibWeb/Page/Page.h> 15 16namespace Web::HTML { 17 18WebIDL::ExceptionOr<JS::NonnullGCPtr<Navigator>> Navigator::create(JS::Realm& realm) 19{ 20 return MUST_OR_THROW_OOM(realm.heap().allocate<Navigator>(realm, realm)); 21} 22 23Navigator::Navigator(JS::Realm& realm) 24 : PlatformObject(realm) 25{ 26} 27 28Navigator::~Navigator() = default; 29 30JS::ThrowCompletionOr<void> Navigator::initialize(JS::Realm& realm) 31{ 32 MUST_OR_THROW_OOM(Base::initialize(realm)); 33 set_prototype(&Bindings::ensure_web_prototype<Bindings::NavigatorPrototype>(realm, "Navigator")); 34 35 return {}; 36} 37 38// https://html.spec.whatwg.org/multipage/system-state.html#dom-navigator-pdfviewerenabled 39bool Navigator::pdf_viewer_enabled() const 40{ 41 // The NavigatorPlugins mixin's pdfViewerEnabled getter steps are to return the user agent's PDF viewer supported. 42 // NOTE: The NavigatorPlugins mixin should only be exposed on the Window object. 43 auto const& window = verify_cast<HTML::Window>(HTML::current_global_object()); 44 return window.page()->pdf_viewer_supported(); 45} 46 47// https://w3c.github.io/webdriver/#dfn-webdriver 48bool Navigator::webdriver() const 49{ 50 // Returns true if webdriver-active flag is set, false otherwise. 51 52 // NOTE: The NavigatorAutomationInformation interface should not be exposed on WorkerNavigator. 53 auto const& window = verify_cast<HTML::Window>(HTML::current_global_object()); 54 return window.page()->is_webdriver_active(); 55} 56 57void Navigator::visit_edges(Cell::Visitor& visitor) 58{ 59 Base::visit_edges(visitor); 60 visitor.visit(m_mime_type_array); 61 visitor.visit(m_plugin_array); 62} 63 64JS::ThrowCompletionOr<JS::NonnullGCPtr<MimeTypeArray>> Navigator::mime_types() 65{ 66 if (!m_mime_type_array) 67 m_mime_type_array = TRY(heap().allocate<MimeTypeArray>(realm(), realm())); 68 return *m_mime_type_array; 69} 70 71JS::ThrowCompletionOr<JS::NonnullGCPtr<PluginArray>> Navigator::plugins() 72{ 73 if (!m_plugin_array) 74 m_plugin_array = TRY(heap().allocate<PluginArray>(realm(), realm())); 75 return *m_plugin_array; 76} 77 78}