Source code for panel.io.browser
"""
Defines a BrowserInfo component exposing the browser window and
navigator APIs.
"""
from __future__ import annotations
from typing import TYPE_CHECKING, ClassVar, Mapping
import param # type: ignore
from ..models.browser import BrowserInfo as _BkBrowserInfo
from ..reactive import Syncable
from .document import create_doc_if_none_exists
from .state import state
if TYPE_CHECKING:
from bokeh.document import Document
from bokeh.model import Model
from pyviz_comms import Comm
[docs]class BrowserInfo(Syncable):
"""
The Location component can be made available in a server context
to provide read and write access to the URL components in the
browser.
"""
dark_mode = param.Boolean(default=None, doc="""
Whether the user prefers dark mode.""")
device_pixel_ratio = param.Number(default=None, doc="""
Provides the ratio of the resolution in physical pixels to
the resolution in CSS pixels for the current display device.""")
language = param.String(default=None, doc="""
The preferred language of the user, usually the language of the
browser UI.""")
timezone = param.String(default=None, doc="""
The timezone configured as the local timezone of the user.""")
timezone_offset = param.Number(default=None, doc="""
The time offset from UTC in minutes.""")
webdriver = param.Boolean(default=None, doc="""
Indicates whether the user agent is controlled by automation.""")
# Mapping from parameter name to bokeh model property name
_rename: ClassVar[Mapping[str, str | None]] = {"name": None}
def _get_model(
self, doc: Document, root: Model | None = None,
parent: Model | None = None, comm: Comm | None = None
) -> Model:
model = _BkBrowserInfo()
root = root or model
self._models[root.ref['id']] = (model, parent)
self._link_props(model, self._linked_properties, doc, root, comm)
return model
[docs] def get_root(
self, doc: Document | None = None, comm: Comm | None = None,
preprocess: bool = True
) -> 'Model':
doc = create_doc_if_none_exists(doc)
root = self._get_model(doc, comm=comm)
ref = root.ref['id']
state._views[ref] = (self, root, doc, comm)
self._documents[doc] = root
return root
def _cleanup(self, root: Model | None = None) -> None:
if root:
if root.document in self._documents:
del self._documents[root.document]
ref = root.ref['id']
else:
ref = None
super()._cleanup(root)
if ref in state._views:
del state._views[ref]