Add sessionStorage based scroll memory for Dartdoc's scrolling divs (#1917)

* Link to source now works, minus icons

* Add material icons

* Refactor dartdoc_test to avoid asynchronous delete collisions

* dartfmt

* Fix windows

* dartfmt

* Tweak padding and change icon to description

* Fix styles to match dartlang site

* Review comments

* Add example and use it in the dartdoc package.

* dartfmt

* Add lscache and give us some scroll memory

* Review comment

* Use sessionStorage.

* Remove setInterval (no longer needed without localStorage)

* Use try-finally and ordering to reduce the risk we might generate a blank page.
diff --git a/lib/resources/script.js b/lib/resources/script.js
index 64cde92..8ee6393 100644
--- a/lib/resources/script.js
+++ b/lib/resources/script.js
@@ -27,6 +27,67 @@
   }
 }
 
+function saveLeftScroll() {
+  var leftSidebar = document.getElementById('dartdoc-sidebar-left');
+  sessionStorage.setItem('dartdoc-sidebar-left-scrollt', leftSidebar.scrollTop);
+  sessionStorage.setItem('dartdoc-sidebar-left-scrolll', leftSidebar.scrollLeft);
+}
+
+function saveMainContentScroll() {
+  var mainContent = document.getElementById('dartdoc-main-content');
+  sessionStorage.setItem('dartdoc-main-content-scrollt', mainContent.scrollTop);
+  sessionStorage.setItem('dartdoc-main-content-scrolll', mainContent.scrollLeft);
+}
+
+function saveRightScroll() {
+  var rightSidebar = document.getElementById('dartdoc-sidebar-right');
+  sessionStorage.setItem('dartdoc-sidebar-right-scrollt', rightSidebar.scrollTop);
+  sessionStorage.setItem('dartdoc-sidebar-right-scrolll', rightSidebar.scrollLeft);
+}
+
+function restoreScrolls() {
+  var leftSidebar = document.getElementById('dartdoc-sidebar-left');
+  var mainContent = document.getElementById('dartdoc-main-content');
+  var rightSidebar = document.getElementById('dartdoc-sidebar-right');
+
+  try {
+    var leftSidebarX = sessionStorage.getItem('dartdoc-sidebar-left-scrolll');
+    var leftSidebarY = sessionStorage.getItem('dartdoc-sidebar-left-scrollt');
+
+    var mainContentX = sessionStorage.getItem('dartdoc-main-content-scrolll');
+    var mainContentY = sessionStorage.getItem('dartdoc-main-content-scrollt');
+
+    var rightSidebarX = sessionStorage.getItem('dartdoc-sidebar-right-scrolll');
+    var rightSidebarY = sessionStorage.getItem('dartdoc-sidebar-right-scrollt');
+
+    leftSidebar.scrollTo(leftSidebarX, leftSidebarY);
+    mainContent.scrollTo(mainContentX, mainContentY);
+    rightSidebar.scrollTo(rightSidebarX, rightSidebarY);
+  } finally {
+    // Set visibility to visible after scroll to prevent the brief appearance of the
+    // panel in the wrong position.
+    leftSidebar.style.visibility = 'visible';
+    mainContent.style.visibility = 'visible';
+    rightSidebar.style.visibility = 'visible';
+  }
+}
+
+function initScrollSave() {
+  var leftSidebar = document.getElementById('dartdoc-sidebar-left');
+  var mainContent = document.getElementById('dartdoc-main-content');
+  var rightSidebar = document.getElementById('dartdoc-sidebar-right');
+
+  // For portablility, use two different ways of attaching saveLeftScroll to events.
+  // Keep the scroll position from expiring from the cache for a page that's been displayed
+  // a long time but not moved by re-saving its position every hour.
+  leftSidebar.onscroll = saveLeftScroll;
+  leftSidebar.addEventListener("scroll", saveLeftScroll, true);
+  mainContent.onscroll = saveMainContentScroll;
+  mainContent.addEventListener("scroll", saveMainContentScroll, true);
+  rightSidebar.onscroll = saveRightScroll;
+  rightSidebar.addEventListener("scroll", saveRightScroll, true);
+}
+
 function initSearch(name) {
   var searchIndex;  // the JSON data
 
@@ -193,8 +254,11 @@
 }
 
 document.addEventListener("DOMContentLoaded", function() {
+  // Place this first so that unexpected exceptions in other JavaScript do not block page visibility.
+  restoreScrolls();
   hljs.initHighlightingOnLoad();
   initSideNav();
+  initScrollSave();
   initSearch("search-box");
   initSearch("search-body");
   initSearch("search-sidebar");
diff --git a/lib/resources/styles.css b/lib/resources/styles.css
index c5b1425..757c4ad 100644
--- a/lib/resources/styles.css
+++ b/lib/resources/styles.css
@@ -80,6 +80,7 @@
   overflow-y: scroll;
   padding: 20px 0 15px 30px;
   margin: 5px 20px 0 0;
+  visibility: hidden; /* shown by Javascript after scroll position restore */
 }
 
 ::-webkit-scrollbar-button{ display: none; height: 13px; border-radius: 0px; background-color: #AAA; }
@@ -95,6 +96,7 @@
   flex: 1;
   overflow-y: scroll;
   padding: 10px 20px 0 20px;
+  visibility: hidden; /* shown by Javascript after scroll position restore */
 }
 
 .sidebar-offcanvas-right {
@@ -103,6 +105,7 @@
   padding: 20px 15px 15px 15px;
   margin-top: 5px;
   margin-right: 20px;
+  visibility: hidden; /* shown by Javascript after scroll position restore */
 }
 /* end for layout */
 
@@ -788,6 +791,7 @@
     padding: 10px;
     margin: 10px 10px;
     box-shadow: 5px 5px 5px 5px #444444;
+    visibility: hidden; /* shown by Javascript after scroll position restore */
   }
 
   ol#sidebar-nav {
diff --git a/lib/templates/404error.html b/lib/templates/404error.html
index e3f6591..968f479 100644
--- a/lib/templates/404error.html
+++ b/lib/templates/404error.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5><span class="package-name">{{self.name}}</span> <span class="package-kind">{{self.kind}}</span></h5>
     {{>packages}}
   </div>
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     <h1>404: Something's gone wrong :-(</h1>
 
     <section class="desc">
@@ -21,4 +21,7 @@
     </section>
   </div> <!-- /.main-content -->
 
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  </div>
+
 {{>footer}}
diff --git a/lib/templates/category.html b/lib/templates/category.html
index fa61c91..4fb9d6f 100644
--- a/lib/templates/category.html
+++ b/lib/templates/category.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5><span class="package-name">{{parent.name}}</span> <span class="package-kind">{{parent.kind}}</span></h5>
     {{>packages}}
   </div>
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#self}}
       <h1>{{name}} {{kind}}</h1>
       {{>documentation}}
@@ -121,7 +121,7 @@
     {{/self}}
 
   </div> <!-- /.main-content -->
-  <div class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
     <h5>{{self.name}} {{self.kind}}</h5>
     {{>sidebar_for_category}}
   </div><!--/sidebar-offcanvas-right-->
diff --git a/lib/templates/class.html b/lib/templates/class.html
index d511c4a..5ffe052 100644
--- a/lib/templates/class.html
+++ b/lib/templates/class.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5>{{parent.name}} {{parent.kind}}</h5>
     {{>sidebar_for_library}}
   </div>
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#self}}
       <div>{{>source_link}}<h1>{{{nameWithGenerics}}} {{kind}} {{>categorization}}</h1></div>
     {{/self}}
@@ -164,7 +164,7 @@
 
   </div> <!-- /.main-content -->
 
-  <div class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
     {{>sidebar_for_class}}
   </div><!--/.sidebar-offcanvas-->
 
diff --git a/lib/templates/constant.html b/lib/templates/constant.html
index f8ae237..f54d3a8 100644
--- a/lib/templates/constant.html
+++ b/lib/templates/constant.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5>{{parent.name}} {{parent.kind}}</h5>
     {{>sidebar_for_class}}
   </div><!--/.sidebar-offcanvas-left-->
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#self}}
       <div>{{>source_link}}<h1>{{{name}}} {{kind}}</h1></div>
     {{/self}}
@@ -27,7 +27,7 @@
 
   </div> <!-- /.main-content -->
 
-  <div class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
   </div><!--/.sidebar-offcanvas-->
 
 {{>footer}}
diff --git a/lib/templates/constructor.html b/lib/templates/constructor.html
index a9f488f..bf7f610 100644
--- a/lib/templates/constructor.html
+++ b/lib/templates/constructor.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5>{{parent.name}} {{parent.kind}}</h5>
     {{>sidebar_for_class}}
   </div><!--/.sidebar-offcanvas-left-->
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#self}}
       <div>{{>source_link}}<h1>{{{nameWithGenerics}}} {{kind}}</h1></div>
     {{/self}}
@@ -33,7 +33,7 @@
     {{/constructor}}
   </div> <!-- /.main-content -->
 
-  <div class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
   </div><!--/.sidebar-offcanvas-->
 
 {{>footer}}
diff --git a/lib/templates/enum.html b/lib/templates/enum.html
index 25a0ac1..424b8bf 100644
--- a/lib/templates/enum.html
+++ b/lib/templates/enum.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5>{{parent.name}} {{parent.kind}}</h5>
     {{>sidebar_for_library}}
   </div>
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#self}}
       <div>{{>source_link}}<h1>{{{name}}} {{kind}} {{>categorization}}</h1></div>
     {{/self}}
@@ -163,7 +163,7 @@
     {{/eNum}}
   </div> <!-- /.main-content -->
 
-  <div class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
     {{>sidebar_for_enum}}
   </div><!--/.sidebar-offcanvas-->
 
diff --git a/lib/templates/function.html b/lib/templates/function.html
index c13f320..f7a42e0 100644
--- a/lib/templates/function.html
+++ b/lib/templates/function.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5>{{parent.name}} {{parent.kind}}</h5>
     {{>sidebar_for_library}}
   </div><!--/.sidebar-offcanvas-left-->
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#self}}
       <div>{{>source_link}}<h1>{{{nameWithGenerics}}} {{kind}} {{>categorization}}</h1></div>
     {{/self}}
@@ -22,7 +22,7 @@
     {{/function}}
   </div> <!-- /.main-content -->
 
-  <div class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
   </div><!--/.sidebar-offcanvas-->
 
 {{>footer}}
diff --git a/lib/templates/index.html b/lib/templates/index.html
index 05139e8..982ca83 100644
--- a/lib/templates/index.html
+++ b/lib/templates/index.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5 class="hidden-xs"><span class="package-name">{{self.name}}</span> <span class="package-kind">{{self.kind}}</span></h5>
     {{>packages}}
   </div>
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#packageGraph.defaultPackage}}
       {{>documentation}}
     {{/packageGraph.defaultPackage}}
@@ -37,4 +37,7 @@
 
   </div> <!-- /.main-content -->
 
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  </div>
+
 {{>footer}}
diff --git a/lib/templates/library.html b/lib/templates/library.html
index ab1c240..67ba592 100644
--- a/lib/templates/library.html
+++ b/lib/templates/library.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5><span class="package-name">{{parent.name}}</span> <span class="package-kind">{{parent.kind}}</span></h5>
     {{>packages}}
   </div>
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#self}}
       <div>{{>source_link}}<h1>{{{name}}} {{kind}} {{>categorization}}</h1></div>
     {{/self}}
@@ -113,7 +113,7 @@
 
   </div> <!-- /.main-content -->
 
-  <div class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
     <h5>{{self.name}} {{self.kind}}</h5>
     {{>sidebar_for_library}}
   </div><!--/sidebar-offcanvas-right-->
diff --git a/lib/templates/method.html b/lib/templates/method.html
index ff612ad..1a8aec7 100644
--- a/lib/templates/method.html
+++ b/lib/templates/method.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5>{{parent.name}} {{parent.kind}}</h5>
     {{>sidebar_for_class}}
   </div><!--/.sidebar-offcanvas-->
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#self}}
       <div>{{>source_link}}<h1>{{{nameWithGenerics}}} {{kind}}</h1></div>
     {{/self}}
@@ -23,7 +23,7 @@
     {{/method}}
   </div> <!-- /.main-content -->
 
-  <div class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
   </div><!--/.sidebar-offcanvas-->
 
 {{>footer}}
diff --git a/lib/templates/mixin.html b/lib/templates/mixin.html
index 20ae6a3..ff9bf0f 100644
--- a/lib/templates/mixin.html
+++ b/lib/templates/mixin.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5>{{parent.name}} {{parent.kind}}</h5>
     {{>sidebar_for_library}}
   </div>
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#self}}
       <div>{{>source_link}}<h1>{{{nameWithGenerics}}} {{kind}} {{>categorization}}</h1></div>
     {{/self}}
@@ -172,7 +172,7 @@
     {{/mixin}}
   </div> <!-- /.main-content -->
 
-  <div class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
     {{>sidebar_for_class}}
   </div><!--/.sidebar-offcanvas-->
 
diff --git a/lib/templates/property.html b/lib/templates/property.html
index 915c420..e6d77b9 100644
--- a/lib/templates/property.html
+++ b/lib/templates/property.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5>{{parent.name}} {{parent.kind}}</h5>
     {{>sidebar_for_class}}
   </div><!--/.sidebar-offcanvas-->
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#self}}
       <div>{{>source_link}}<h1>{{name}} {{kind}}</h1></div>
     {{/self}}
@@ -34,7 +34,7 @@
     {{/self}}
   </div> <!-- /.main-content -->
 
-  <div class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
   </div><!--/.sidebar-offcanvas-->
 
 {{>footer}}
diff --git a/lib/templates/top_level_constant.html b/lib/templates/top_level_constant.html
index 60499ef..41e7854 100644
--- a/lib/templates/top_level_constant.html
+++ b/lib/templates/top_level_constant.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5>{{parent.name}} {{parent.kind}}</h5>
     {{>sidebar_for_library}}
   </div><!--/.sidebar-offcanvas-left-->
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#self}}
     <div>{{>source_link}}<h1>{{{name}}} {{kind}} {{>categorization}}</h1></div>
 
@@ -23,7 +23,7 @@
 
   </div> <!-- /.main-content -->
 
-  <div class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
   </div><!--/.sidebar-offcanvas-->
 
 {{>footer}}
diff --git a/lib/templates/top_level_property.html b/lib/templates/top_level_property.html
index f3682c2..582d78e 100644
--- a/lib/templates/top_level_property.html
+++ b/lib/templates/top_level_property.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5>{{parent.name}} {{parent.kind}}</h5>
     {{>sidebar_for_library}}
   </div><!--/.sidebar-offcanvas-left-->
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#self}}
     <div>{{>source_link}}<h1>{{{name}}} {{kind}} {{>categorization}}</h1></div>
 
@@ -30,7 +30,7 @@
     {{/self}}
   </div> <!-- /.main-content -->
 
-  <div class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
   </div><!--/.sidebar-offcanvas-->
 
 {{>footer}}
\ No newline at end of file
diff --git a/lib/templates/typedef.html b/lib/templates/typedef.html
index eb064ca..336fcf6 100644
--- a/lib/templates/typedef.html
+++ b/lib/templates/typedef.html
@@ -1,12 +1,12 @@
 {{>head}}
 
-  <div class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
+  <div id="dartdoc-sidebar-left" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left">
     {{>search_sidebar}}
     <h5>{{parent.name}} {{parent.kind}}</h5>
     {{>sidebar_for_library}}
   </div><!--/.sidebar-offcanvas-left-->
 
-  <div class="col-xs-12 col-sm-9 col-md-8 main-content">
+  <div id="dartdoc-main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
     {{#self}}
     <div>{{>source_link}}<h1>{{{nameWithGenerics}}} {{kind}} {{>categorization}}</h1></div>
     {{/self}}
@@ -24,7 +24,7 @@
 
   </div> <!-- /.main-content -->
 
-  <div class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+  <div id="dartdoc-sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
   </div><!--/.sidebar-offcanvas-->
 
 {{>footer}}