blob: 0beb6bd055c8620b37ce84a88265f85a223787da [file] [log] [blame]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:html';
import 'highlight.dart' as highlight;
import 'search.dart' as search;
import 'sidenav.dart' as sidenav;
import 'theme.dart' as theme;
void main() {
highlight.init();
initializeSidebars();
sidenav.init();
search.init();
theme.init();
}
void initializeSidebars() {
final body = document.querySelector('body');
if (body == null) {
return;
}
final dataUsingBaseHref = body.dataset['using-base-href'];
if (dataUsingBaseHref == null) {
// This should never happen.
return;
}
var baseHref = '';
if (dataUsingBaseHref != 'true') {
final dataBaseHref = body.dataset['base-href'];
if (dataBaseHref == null) {
return;
}
baseHref = dataBaseHref;
}
final mainContent = document.querySelector('#dartdoc-main-content');
if (mainContent == null) {
return;
}
final aboveSidebarPath = mainContent.dataset['above-sidebar'];
final leftSidebar = document.querySelector('#dartdoc-sidebar-left-content');
final sanitizer = _SidebarNodeTreeSanitizer(baseHref);
if (aboveSidebarPath != null &&
aboveSidebarPath.isNotEmpty &&
leftSidebar != null) {
HttpRequest.getString('$baseHref$aboveSidebarPath').then((content) {
leftSidebar.setInnerHtml(content, treeSanitizer: sanitizer);
});
}
final belowSidebarPath = mainContent.dataset['below-sidebar'];
final rightSidebar = document.querySelector('#dartdoc-sidebar-right');
if (belowSidebarPath != null &&
belowSidebarPath.isNotEmpty &&
rightSidebar != null) {
HttpRequest.getString('$baseHref$belowSidebarPath').then((content) {
rightSidebar.setInnerHtml(content, treeSanitizer: sanitizer);
});
}
}
/// A permissive sanitizer that allows external links (e.g. to api.dart.dev) and
/// adjusts the links in a newly loaded sidebar, if "base href" is not being
/// used.
class _SidebarNodeTreeSanitizer implements NodeTreeSanitizer {
final String baseHref;
_SidebarNodeTreeSanitizer(this.baseHref);
@override
void sanitizeTree(Node node) {
if (node is Element && node.nodeName == 'A') {
final hrefString = node.attributes['href'];
if (hrefString != null) {
final href = Uri.parse(hrefString);
if (!href.isAbsolute) {
node.setAttribute('href', '$baseHref$hrefString');
}
}
}
node.childNodes.forEach(sanitizeTree);
}
}