diff --git a/aio/e2e/app.e2e-spec.ts b/aio/e2e/app.e2e-spec.ts index 991e1ec9ab..bb6df2b2e4 100644 --- a/aio/e2e/app.e2e-spec.ts +++ b/aio/e2e/app.e2e-spec.ts @@ -41,6 +41,26 @@ describe('site App', function() { expect(page.getInnerHtml(codeExample)).toContain('<h1>Tour of Heroes</h1>'); }); + describe('scrolling to the top', () => { + it('should scroll to the top when navigating to another page', () => { + page.navigateTo('guide/docs'); + page.scrollToBottom(); + page.getScrollTop().then(scrollTop => expect(scrollTop).toBeGreaterThan(0)); + + page.navigateTo('guide/api'); + page.getScrollTop().then(scrollTop => expect(scrollTop).toBe(0)); + }); + + it('should scroll to the top when navigating to the same page', () => { + page.navigateTo('guide/docs'); + page.scrollToBottom(); + page.getScrollTop().then(scrollTop => expect(scrollTop).toBeGreaterThan(0)); + + page.navigateTo('guide/docs'); + page.getScrollTop().then(scrollTop => expect(scrollTop).toBe(0)); + }); + }); + describe('api-docs', () => { it('should show a link to github', () => { page.navigateTo('api/common/NgClass'); diff --git a/aio/e2e/app.po.ts b/aio/e2e/app.po.ts index 2677ac7dd3..8de49d0f29 100644 --- a/aio/e2e/app.po.ts +++ b/aio/e2e/app.po.ts @@ -42,6 +42,14 @@ export class SitePage { return browser.executeScript('return arguments[0].innerHTML;', element); } + getScrollTop() { + return browser.executeScript('return window.pageYOffset'); + } + + scrollToBottom() { + return browser.executeScript('window.scrollTo(0, document.body.scrollHeight)'); + } + /** * Replace the ambient Google Analytics tracker with homebrew spy * don't send commands to GA during e2e testing! diff --git a/aio/src/app/app.component.html b/aio/src/app/app.component.html index 2c510b6056..f22ee9eacd 100644 --- a/aio/src/app/app.component.html +++ b/aio/src/app/app.component.html @@ -1,3 +1,5 @@ +
+
@@ -28,7 +30,6 @@
-
diff --git a/aio/src/app/shared/scroll.service.spec.ts b/aio/src/app/shared/scroll.service.spec.ts index f8cb57422e..f419bd8fb9 100644 --- a/aio/src/app/shared/scroll.service.spec.ts +++ b/aio/src/app/shared/scroll.service.spec.ts @@ -17,7 +17,6 @@ describe('ScrollService', () => { class MockDocument { body = new MockElement(); getElementById = jasmine.createSpy('Document getElementById'); - querySelector = jasmine.createSpy('Document querySelector'); } class MockElement { diff --git a/aio/src/app/shared/scroll.service.ts b/aio/src/app/shared/scroll.service.ts index 0b37feaeaf..d33478ca7e 100644 --- a/aio/src/app/shared/scroll.service.ts +++ b/aio/src/app/shared/scroll.service.ts @@ -12,11 +12,12 @@ export class ScrollService { private _topOffset: number; private _topOfPageElement: Element; - /** Offset from the top of the document to bottom of toolbar + some margin */ + // Offset from the top of the document to bottom of any static elements + // at the top (e.g. toolbar) + some margin get topOffset() { if (!this._topOffset) { - const toolbar = document.querySelector('md-toolbar.app-toolbar'); - this._topOffset = (toolbar ? toolbar.clientHeight : 0) + topMargin; + // Since the toolbar is not static, we don't need to account for its height. + this._topOffset = topMargin; } return this._topOffset; } diff --git a/aio/src/app/shared/toc.service.spec.ts b/aio/src/app/shared/toc.service.spec.ts index 26de824352..2e79b881c6 100644 --- a/aio/src/app/shared/toc.service.spec.ts +++ b/aio/src/app/shared/toc.service.spec.ts @@ -243,6 +243,11 @@ describe('TocService', () => { expect(tocItem.href).toEqual(`${docId}#heading-one-special-id`); }); + it('should have level "h1" for an

', () => { + const tocItem = lastTocList.find(item => item.title === 'Fun with TOC'); + expect(tocItem.level).toEqual('h1'); + }); + it('should have level "h2" for an

', () => { const tocItem = lastTocList.find(item => item.title === 'Heading one'); expect(tocItem.level).toEqual('h2');