/* * Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ */ var moduleSearchIndex; var packageSearchIndex; var typeSearchIndex; var memberSearchIndex; var tagSearchIndex; var oddRowColor = "odd-row-color"; var evenRowColor = "even-row-color"; var sortAsc = "sort-asc"; var sortDesc = "sort-desc"; var tableTab = "table-tab"; var activeTableTab = "active-table-tab"; const linkIcon = "Link icon"; const linkToSection = "Link to this section"; if (typeof hljs !== "undefined") { try { hljs.highlightAll(); } catch (err) { console.error(err) } } function loadScripts(doc, tag) { createElem(doc, tag, 'script-files/search.js'); createElem(doc, tag, 'module-search-index.js'); createElem(doc, tag, 'package-search-index.js'); createElem(doc, tag, 'type-search-index.js'); createElem(doc, tag, 'member-search-index.js'); createElem(doc, tag, 'tag-search-index.js'); } function createElem(doc, tag, path) { var script = doc.createElement(tag); var scriptElement = doc.getElementsByTagName(tag)[0]; script.src = pathtoroot + path; scriptElement.parentNode.insertBefore(script, scriptElement); } // Helper for making content containing release names comparable lexicographically function makeComparable(s) { return s.toLowerCase().replace(/(\d+)/g, function(n, m) { return ("000" + m).slice(-4); }); } // Switches between two styles depending on a condition function toggleStyle(classList, condition, trueStyle, falseStyle) { if (condition) { classList.remove(falseStyle); classList.add(trueStyle); } else { classList.remove(trueStyle); classList.add(falseStyle); } } // Sorts the rows in a table lexicographically by the content of a specific column function sortTable(header, columnIndex, columns) { var container = header.parentElement; var descending = header.classList.contains(sortAsc); container.querySelectorAll("div.table-header").forEach( function(header) { header.classList.remove(sortAsc); header.classList.remove(sortDesc); } ) var cells = container.children; var rows = []; for (var i = columns; i < cells.length; i += columns) { rows.push(Array.prototype.slice.call(cells, i, i + columns)); } var comparator = function(a, b) { var ka = makeComparable(a[columnIndex].textContent); var kb = makeComparable(b[columnIndex].textContent); if (ka < kb) return descending ? 1 : -1; if (ka > kb) return descending ? -1 : 1; return 0; }; var sorted = rows.sort(comparator); var visible = 0; sorted.forEach(function(row) { if (row[0].style.display !== 'none') { var isEvenRow = visible++ % 2 === 0; } row.forEach(function(cell) { toggleStyle(cell.classList, isEvenRow, evenRowColor, oddRowColor); container.appendChild(cell); }) }); toggleStyle(header.classList, descending, sortDesc, sortAsc); } // Toggles the visibility of a table category in all tables in a page function toggleGlobal(checkbox, selected, columns) { const display = checkbox.checked ? '' : 'none'; const selectOther = selected === "other"; const selectAll = selected === "all"; if (selectAll) { document.querySelectorAll('.checkboxes input[type="checkbox"]').forEach(c => { c.checked = checkbox.checked; }); } document.querySelectorAll("div.table-tabs").forEach(t => { const id = t.parentElement.getAttribute("id"); const selectedClass = id + "-tab" + (selectOther ? "" : selected); var visible = 0; t.parentElement.querySelectorAll('div.' + id) .forEach(function(elem) { if (selectAll || (!selectOther && elem.classList.contains(selectedClass)) || (selectOther && elem.className.indexOf(selectedClass) < 0)) { elem.style.display = display; } if (elem.style.display === '') { var isEvenRow = visible++ % (columns * 2) < columns; toggleStyle(elem.classList, isEvenRow, evenRowColor, oddRowColor); } }); var displaySection = visible === 0 ? 'none' : ''; t.parentElement.style.display = displaySection; document.querySelector("li#contents-" + id).style.display = displaySection; }) } // Shows the elements of a table belonging to a specific category function show(tableId, selected, columns) { if (tableId !== selected) { document.querySelectorAll('div.' + tableId + ':not(.' + selected + ')') .forEach(function(elem) { elem.style.display = 'none'; }); } document.querySelectorAll('div.' + selected) .forEach(function(elem, index) { elem.style.display = ''; var isEvenRow = index % (columns * 2) < columns; toggleStyle(elem.classList, isEvenRow, evenRowColor, oddRowColor); }); updateTabs(tableId, selected); } function updateTabs(tableId, selected) { document.getElementById(tableId + '.tabpanel') .setAttribute('aria-labelledby', selected); document.querySelectorAll('button[id^="' + tableId + '"]') .forEach(function(tab, index) { if (selected === tab.id || (tableId === selected && index === 0)) { tab.className = activeTableTab; tab.setAttribute('aria-selected', true); tab.setAttribute('tabindex',0); } else { tab.className = tableTab; tab.setAttribute('aria-selected', false); tab.setAttribute('tabindex',-1); } }); } function switchTab(e) { var selected = document.querySelector('[aria-selected=true]'); if (selected) { if ((e.keyCode === 37 || e.keyCode === 38) && selected.previousSibling) { // left or up arrow key pressed: move focus to previous tab selected.previousSibling.click(); selected.previousSibling.focus(); e.preventDefault(); } else if ((e.keyCode === 39 || e.keyCode === 40) && selected.nextSibling) { // right or down arrow key pressed: move focus to next tab selected.nextSibling.click(); selected.nextSibling.focus(); e.preventDefault(); } } } var updateSearchResults = function() {}; function indexFilesLoaded() { return moduleSearchIndex && packageSearchIndex && typeSearchIndex && memberSearchIndex && tagSearchIndex; } // Copy the contents of the local snippet to the clipboard function copySnippet(button) { copyToClipboard(button.nextElementSibling.innerText); switchCopyLabel(button, button.firstElementChild); } function copyToClipboard(content) { var textarea = document.createElement("textarea"); textarea.style.height = 0; document.body.appendChild(textarea); textarea.value = content; textarea.select(); document.execCommand("copy"); document.body.removeChild(textarea); } function resetInput(input, event, blur) { if (input.value) { input.value = ""; input.dispatchEvent(new InputEvent("input")); } else if (blur) { input.blur(); } event.preventDefault(); } function isInput(elem) { return elem instanceof HTMLInputElement && elem.type === "text"; } function switchCopyLabel(button, span) { var copied = span.getAttribute("data-copied"); button.classList.add("visible"); var initialLabel = span.innerHTML; span.innerHTML = copied; setTimeout(function() { button.classList.remove("visible"); setTimeout(function() { if (initialLabel !== copied) { span.innerHTML = initialLabel; } }, 100); }, 1900); } function makeFilterWidget(sidebar, updateToc) { if (!sidebar) { return null; } const filterInput = sidebar.querySelector("input.filter-input"); const resetInput = sidebar.querySelector("input.reset-filter"); sidebar.addEventListener("keydown", e => { if (e.ctrlKey || e.altKey || e.metaKey) { return; } if (e.key === "ArrowUp" || e.key === "ArrowDown") { handleTocFocus(e); } else if (filterInput && e.target !== filterInput) { if (e.key === "Enter" && isTocLink(sidebar, e.target)) { filterInput.value = ""; filterInput.dispatchEvent(new InputEvent("input")); } else if (e.key.length === 1 || e.key === "Backspace") { filterInput.focus(); } } }); if (filterInput) { filterInput.removeAttribute("disabled"); filterInput.setAttribute("autocapitalize", "off"); filterInput.value = ""; filterInput.addEventListener("input", function(e) { resetInput.style.visibility = filterInput.value ? "visible" : "hidden"; const pattern = filterInput.value ? filterInput.value.trim() .replace(/[\[\]{}()*+?.\\^$|]/g, '\\$&') .replace(/\s+/g, ".*") : ""; const filter = new RegExp(pattern, "i"); sidebar.querySelectorAll("ol.toc-list li").forEach((li) => { if (filter.test(li.innerText)) { // li.removeAttribute("style"); const selfMatch = filter.test(li.firstElementChild.innerText); li.style.display = "block"; li.firstElementChild.style.opacity = selfMatch ? "100%" : "70%"; li.firstElementChild.tabIndex = selfMatch ? 0 : -1; } else { li.style.display = "none"; } }); updateToc(); }); } if (resetInput) { resetInput.removeAttribute("disabled"); resetInput.addEventListener("click", (e) => { filterInput.value = ""; filterInput.focus(); filterInput.dispatchEvent(new InputEvent("input")); }); } function handleTocFocus(event) { let links = Array.from(sidebar.querySelectorAll("ol > li > a")) .filter(link => link.offsetParent && link.tabIndex === 0); let current = links.indexOf(document.activeElement); if (event.key === "ArrowUp") { if (current > 0) { links[current - 1].focus({focusVisible: true}); } else if (filterInput) { filterInput.focus(); } } else if (event.key === "ArrowDown" && current < links.length - 1) { links[current + 1].focus({focusVisible: true}); } event.preventDefault(); } function isTocLink(sidebar, elem) { let links = Array.from(sidebar.querySelectorAll("ol > li > a")) .filter(link => link.offsetParent && link.tabIndex === 0); return links.indexOf(elem) > -1; } return sidebar; } function setTopMargin() { // Dynamically set scroll margin to accomodate for draft header var headerHeight = Math.ceil(document.querySelector("header").offsetHeight); document.querySelector(":root") .style.setProperty("--nav-height", headerHeight + "px"); } document.addEventListener("readystatechange", (e) => { if (document.readyState === "interactive") { setTopMargin(); } if (sessionStorage.getItem("sidebar") === "hidden") { const sidebar = document.querySelector(".main-grid nav.toc"); if (sidebar) sidebar.classList.add("hide-sidebar"); } }); document.addEventListener("DOMContentLoaded", function(e) { setTopMargin(); // Make sure current element is visible in breadcrumb navigation on small displays const subnav = document.querySelector("ol.sub-nav-list"); if (subnav && subnav.lastElementChild) { subnav.lastElementChild.scrollIntoView({ behavior: "instant", inline: "start", block: "nearest" }); } const keymap = new Map(); const searchInput = document.getElementById("search-input") || document.getElementById("page-search-input"); if (searchInput) { searchInput.addEventListener("focus", collapse); keymap.set("/", searchInput); } const filterInput = document.querySelector("input.filter-input"); if (filterInput) { keymap.set(".", filterInput); } // Clone TOC sidebar to header for mobile navigation const navbar = document.querySelector("div#navbar-top"); const sidebar = document.querySelector(".main-grid nav.toc"); const main = document.querySelector(".main-grid main"); const mainnav = navbar.querySelector("ul.nav-list"); const toggleButton = document.querySelector("button#navbar-toggle-button"); const tocMenu = sidebar ? sidebar.cloneNode(true) : null; makeFilterWidget(sidebar, updateToc); if (tocMenu) { navbar.appendChild(tocMenu); makeFilterWidget(tocMenu, updateToc); var menuInput = tocMenu.querySelector("input.filter-input"); } document.addEventListener("keydown", (e) => { if (e.ctrlKey || e.altKey || e.metaKey) { return; } if (!isInput(e.target) && keymap.has(e.key)) { var elem = keymap.get(e.key); if (elem === filterInput && !elem.offsetParent) { elem = getVisibleFilterInput(true); } elem.focus(); elem.select(); e.preventDefault(); } else if (e.key === "Escape") { if (expanded) { collapse(); e.preventDefault(); } else if (e.target.id === "page-search-input") { resetInput(e.target, e, false); } else if (isInput(e.target)) { resetInput(e.target, e, true); } else { var filter = getVisibleFilterInput(false); if (filter && filter.value) { resetInput(filterInput, e, true); } } } }); var expanded = false; var windowWidth; var bodyHeight; function collapse() { if (expanded) { mainnav.removeAttribute("style"); if (tocMenu) { tocMenu.removeAttribute("style"); if (filterInput) { keymap.set(".", filterInput); } } toggleButton.classList.remove("expanded") toggleButton.setAttribute("aria-expanded", "false"); expanded = false; } } function expand() { expanded = true; mainnav.style.display = "block"; mainnav.style.removeProperty("height"); var maxHeight = window.innerHeight - subnav.offsetTop + 4; var expandedHeight = Math.min(maxHeight, mainnav.scrollHeight + 10); if (tocMenu) { tocMenu.style.display = "flex"; expandedHeight = Math.min(maxHeight, Math.max(expandedHeight, tocMenu.querySelector("div.toc-header").offsetHeight + tocMenu.querySelector("ol.toc-list").scrollHeight + 10)); tocMenu.style.height = expandedHeight + "px"; if (menuInput) { keymap.set(".", menuInput); } } mainnav.style.height = expandedHeight + "px"; toggleButton.classList.add("expanded"); toggleButton.setAttribute("aria-expanded", "true"); windowWidth = window.innerWidth; } function updateToc() { if (expanded) { expand(); } else { prevHash = null; handleScroll(); } } function getVisibleFilterInput(show) { if (sidebar && sidebar.offsetParent) { if (show) { showSidebar(); } return filterInput; } else { if (show) { expand(); } return menuInput; } } toggleButton.addEventListener("click", (e) => { if (expanded) { collapse(); } else { expand(); } }); if (tocMenu) { tocMenu.querySelectorAll("a").forEach((link) => { link.addEventListener("click", collapse); }); } document.querySelector("main").addEventListener("click", collapse); document.querySelectorAll("h1, h2, h3, h4, h5, h6") .forEach((hdr, idx) => { // Create anchor links for headers with an associated id attribute var id = hdr.parentElement.getAttribute("id") || hdr.getAttribute("id") || (hdr.querySelector("a") && hdr.querySelector("a").getAttribute("id")); if (id) { var template = document.createElement('template'); template.innerHTML =" " + linkIcon +""; hdr.append(...template.content.childNodes); } }); var sections; var scrollTimeout; var prevHash; function initSectionData() { bodyHeight = document.body.offsetHeight; sections = [{ id: "", top: 0 }].concat(Array.from(main.querySelectorAll( "section[id], h2[id], h2 a[id], h3[id], h3 a[id], div[id]")) .filter((e) => { return sidebar.querySelector("a[href=\"#" + encodeURI(e.getAttribute("id")) + "\"]") !== null }).map((e) => { return { id: e.getAttribute("id"), top: e.offsetTop }; })); } function setScrollTimeout() { if (scrollTimeout) { clearTimeout(scrollTimeout); } scrollTimeout = setTimeout(() => { scrollTimeout = null; }, 100); } function handleScroll() { if (!sidebar || !sidebar.offsetParent || sidebar.classList.contains("hide-sidebar")) { return; } if (scrollTimeout) { setScrollTimeout(); return; } var scrollTop = document.documentElement.scrollTop; var scrollHeight = document.documentElement.scrollHeight; var currHash = null; for (var i = 0; i < sections.length; i++) { var top = sections[i].top; var bottom = sections[i + 1] ? sections[i + 1].top : scrollHeight; if (top + ((bottom - top) / 2) > scrollTop || bottom > scrollTop + (window.innerHeight / 3)) { currHash = "#" + encodeURI(sections[i].id); break; } } if (currHash !== prevHash) { setSelected(currHash); } } function setSelected(hash) { var prev = sidebar.querySelector("a.current-selection"); if (prev) prev.classList.remove("current-selection"); prevHash = hash; if (hash) { var curr = sidebar.querySelector("ol.toc-list a[href=\"" + hash + "\"]"); if (curr) { curr.classList.add("current-selection"); curr.scrollIntoView({ behavior: "instant", block: "nearest" }); } } } function hideSidebar() { sidebar.classList.add("hide-sidebar"); sessionStorage.setItem("sidebar", "hidden"); } function showSidebar() { sidebar.classList.remove("hide-sidebar"); sessionStorage.removeItem("sidebar"); initSectionData(); handleScroll(); } if (sidebar) { initSectionData(); document.querySelectorAll("a[href^='#']").forEach((link) => { link.addEventListener("click", (e) => { link.blur(); setScrollTimeout(); setSelected(link.getAttribute("href")); }) }); sidebar.querySelector("button.hide-sidebar").addEventListener("click", hideSidebar); sidebar.querySelector("button.show-sidebar").addEventListener("click", showSidebar); window.addEventListener("hashchange", (e) => { setScrollTimeout(); const hash = e.newURL.indexOf("#"); if (hash > -1) { setSelected(e.newURL.substring(hash)); } }); if (document.location.hash) { setScrollTimeout(); setSelected(document.location.hash); } else { handleScroll(); } window.addEventListener("scroll", handleScroll); } // Resize handler new ResizeObserver((entries) => { if (expanded) { if (windowWidth !== window.innerWidth) { collapse(); } else { expand(); } } if (sections && document.body.offsetHeight !== bodyHeight) { initSectionData(); prevHash = null; handleScroll(); } setTopMargin(); }).observe(document.body); });