Chromium Code Reviews| Index: chrome/test/data/webui/net_internals/timeline_view.js |
| =================================================================== |
| --- chrome/test/data/webui/net_internals/timeline_view.js (revision 0) |
| +++ chrome/test/data/webui/net_internals/timeline_view.js (revision 0) |
| @@ -0,0 +1,392 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +// Anonymous namespace |
| +(function() { |
| + |
| +// Range of time set on a log once loaded used by sanity checks. |
| +// Used by sanityCheckWithTimeRange. |
| +var startTime = null; |
| +var endTime = null; |
| + |
| +var timelineView = TimelineView.getInstance(); |
| +var graphView = timelineView.graphView_; |
| +var scrollbar = graphView.scrollbar_; |
| +var canvas = graphView.canvas_; |
| + |
| +/** |
| + * A Task that creates a log dump, modifies it so |timeTicks| are all in UTC, |
| + * clears all events from the log, and then adds two new SOCKET events, which |
| + * are two full widths of the scrollbar apart, at the current zoom. |
| + * |
| + * Most of these tests start with this task first. This gives us a known |
| + * starting state, and prevents the data from automatically updating. |
| + * |
| + * @param {int} startTime Time of the begin event. |
| + * @param {int} startTime Time of the end event. |
| + * @extends {netInternalsTest.Task} |
| + */ |
| +function LoadLogWithNewEventsTask(startTime, endTime) { |
| + netInternalsTest.Task.call(this); |
| + this.startTime_ = startTime; |
| + this.endTime_ = endTime; |
| +} |
| + |
| +LoadLogWithNewEventsTask.prototype = { |
| + __proto__: netInternalsTest.Task.prototype, |
| + |
| + /** |
| + * Starts creating a log dump. |
| + */ |
| + start: function() { |
| + logutil.createLogDumpAsync('test', this.onLogDumpCreated.bind(this)); |
| + }, |
| + |
| + /** |
| + * Modifies the log dump and loads it. |
| + */ |
| + onLogDumpCreated: function(logDumpText) { |
| + var logDump = JSON.parse(logDumpText); |
| + |
| + logDump.constants.timeTickOffset = '0'; |
| + logDump.events = []; |
| + |
| + var source = new netInternalsTest.Source(1, LogSourceType.SOCKET); |
| + logDump.events.push( |
| + netInternalsTest.CreateBeginEvent(source, LogEventType.SOCKET_ALIVE, |
| + this.startTime_, null)); |
| + logDump.events.push( |
| + netInternalsTest.CreateMatchingEndEvent(logDump.events[0], |
| + this.endTime_, null)); |
| + logDumpText = JSON.stringify(logDump); |
| + |
| + assertEquals('Log loaded.', logutil.loadLogFile(logDumpText)); |
| + |
| + endTime = this.endTime_; |
| + startTime = this.startTime_; |
| + if (startTime >= endTime) |
| + --startTime; |
| + |
| + sanityCheckWithTimeRange(false); |
| + |
| + this.onTaskDone(); |
| + } |
| +}; |
| + |
| +/** |
| + * Checks certain invariant properties of the TimelineGraphView and the |
| + * scroll bar. |
| + */ |
| +function sanityCheck() { |
| + expectLT(graphView.startTime_, graphView.endTime_); |
| + expectLE(0, scrollbar.getPosition()); |
| + expectLE(scrollbar.getPosition(), scrollbar.getRange()); |
| +} |
| + |
| +/** |
| + * Checks what sanityCheck does, but also checks that |startTime| and |endTime| |
| + * are the same as those used by the graph, as well as whether we have a timer |
| + * running to update the graph's end time. To avoid flake, this should only |
| + * be used synchronously relative to when |startTime| and |endTime| were set, |
| + * unless |expectUpdateTimer| is false. |
| + * @param {bool} expectUpdateTimer true if the TimelineView should currently |
| + * have an update end time timer running. |
| + */ |
| +function sanityCheckWithTimeRange(expectUpdateTimer) { |
| + if (!expectUpdateTimer) { |
| + expectEquals(null, timelineView.updateIntervalId_); |
| + } else { |
| + expectNotEquals(null, timelineView.updateIntervalId_); |
| + } |
| + assertNotEquals(startTime, null); |
| + assertNotEquals(endTime, null); |
| + expectEquals(startTime, graphView.startTime_); |
| + expectEquals(endTime, graphView.endTime_); |
| + sanityCheck(false); |
| +} |
| + |
| +/** |
| + * Checks what sanityCheck does, but also checks that |startTime| and |endTime| |
| + * are the same as those used by the graph. |
| + */ |
| +function sanityCheckNotUpdating() { |
| + expectEquals(null, timelineView.updateIntervalId_); |
| + sanityCheckWithTimeRange(); |
| +} |
| + |
| +/** |
| + * Simulates mouse wheel movement over the canvas element. |
| + * @param {number} mouseWheelMovement Amount of movement to simulate. |
| + */ |
| +function mouseZoom(mouseWheelMovement) { |
| + var scrollbarStartedAtEnd = |
| + (scrollbar.getRange() == scrollbar.getPosition()); |
| + |
| + var event = document.createEvent('WheelEvent'); |
| + event.initWebKitWheelEvent(0, mouseWheelMovement, window, 0, 0, 0, 0, |
| + false, false, false, false); |
| + canvas.dispatchEvent(event); |
| + |
| + // If the scrollbar started at the end of the range, make sure it ends there |
| + // as well. |
| + if (scrollbarStartedAtEnd) |
| + expectEquals(scrollbar.getRange(), scrollbar.getPosition()); |
| + |
| + sanityCheck(); |
| +} |
| + |
| +/** |
| + * Simulates moving the mouse wheel up. |
| + */ |
| +function mouseZoomIn() { |
| + var oldScale = graphView.scale_; |
| + var oldRange = scrollbar.getRange(); |
| + |
| + mouseZoom(1); |
| + |
| + if (oldScale == graphView.scale_) { |
| + expectEquals(oldScale, TimelineGraphView.MIN_SCALE); |
| + } else { |
| + expectLT(graphView.scale_, oldScale); |
| + } |
| + expectGE(scrollbar.getRange(), oldRange); |
| +} |
| + |
| +/** |
| + * Simulates moving the mouse wheel down. |
| + */ |
| +function mouseZoomOut() { |
|
eroman
2011/11/16 04:03:46
nice with the testing!
|
| + var oldScale = graphView.scale_; |
| + var oldRange = scrollbar.getRange(); |
| + |
| + mouseZoom(-1); |
| + |
| + expectGT(graphView.scale_, oldScale); |
| + expectLE(scrollbar.getRange(), oldRange); |
| +} |
| + |
| +/** |
| + * Simulates zooming all the way by repeated mousemovement. |
| + */ |
| +function mouseZoomAllTheWayIn() { |
| + expectLT(TimelineGraphView.MIN_SCALE, graphView.scale_); |
| + while (graphView.scale_ != TimelineGraphView.MIN_SCALE) |
| + mouseZoomIn(); |
| + // Verify that zooming in when already at max zoom works. |
| + mouseZoomIn(); |
| +} |
| + |
| +/** |
| + * A Task that scrolls the scrollbar by manipulating the DOM, and then waits |
| + * for the scroll to complete. Has to be a task because onscroll and DOM |
| + * manipulations both occur asynchronously. |
| + * |
| + * Not safe to use when other asynchronously running code may try to |
| + * maniplulate the scrollbar itself, or adjust the length of the scrollbar. |
| + * |
| + * @param {int} startTime Time of the begin event. |
| + * @param {int} startTime Time of the end event. |
| + * @extends {netInternalsTest.Task} |
| + */ |
| +function MouseScrollTask(position) { |
| + netInternalsTest.Task.call(this); |
| + this.position_ = position; |
| + // If the scrollbar's |position| and its node's |scrollLeft| values don't |
| + // currently match, we set this to true and wait for |scrollLeft| to be |
| + // updated, which will trigger an onscroll event. |
| + this.waitingToStart_ = false; |
| +} |
| + |
| +MouseScrollTask.prototype = { |
| + __proto__: netInternalsTest.Task.prototype, |
| + |
| + start: function() { |
| + this.waitingToStart_ = false; |
| + // If the scrollbar is already in the correct position, do nothing. |
| + if (scrollbar.getNode().scrollLeft == this.position_) { |
| + // We may still have a timer going to adjust the position of the |
| + // scrollbar. If so, this will clear it. |
| + scrollbar.setPosition(this.position_); |
| + this.onTaskDone(); |
| + return; |
| + } |
| + |
| + // Replace the onscroll event handler with our own. |
| + this.oldOnScroll_ = scrollbar.getNode().onscroll; |
| + scrollbar.getNode().onscroll = this.onScroll_.bind(this); |
| + if (scrollbar.getNode().scrollLeft != scrollbar.getPosition()) { |
| + this.waitingToStart_ = true; |
| + return; |
| + } |
| + |
| + window.setTimeout(this.startScrolling_.bind(this), 0); |
| + }, |
| + |
| + onScroll_: function(event) { |
| + // Restore the original onscroll function. |
| + scrollbar.getNode().onscroll = this.oldOnScroll_; |
| + // Call the original onscroll function. |
| + this.oldOnScroll_(event); |
| + |
| + if (this.waitingToStart_) { |
| + this.start(); |
| + return; |
| + } |
| + |
| + assertEquals(this.position_, scrollbar.getNode().scrollLeft); |
| + assertEquals(this.position_, scrollbar.getPosition()); |
| + |
| + sanityCheck(); |
| + this.onTaskDone(); |
| + }, |
| + |
| + startScrolling_: function() { |
| + scrollbar.getNode().scrollLeft = this.position_; |
| + } |
| +}; |
| + |
| +netInternalsTest.test('netInternalsTimelineViewRange', function() { |
| + netInternalsTest.switchToView('timeline'); |
| + |
| + // Set startTime/endTime for sanity checks. |
| + startTime = graphView.startTime_; |
| + endTime = graphView.endTime_; |
| + sanityCheckWithTimeRange(true); |
| + |
| + startTime = 0; |
| + endTime = 10; |
| + graphView.setDateRange(new Date(startTime), new Date(endTime)); |
| + sanityCheckWithTimeRange(true); |
| + |
| + endTime = (new Date()).getTime(); |
| + graphView.updateEndDate(); |
| + |
| + expectGE(graphView.endTime_, endTime); |
| + sanityCheck(); |
| + |
| + testDone(); |
| +}); |
| + |
| +netInternalsTest.test('netInternalsTimelineViewScrollbar', function() { |
| + var expectedGraphRange = canvas.width; |
| + |
| + function checkGraphRange() { |
| + expectEquals(expectedGraphRange, scrollbar.getRange()); |
| + } |
| + |
| + var taskQueue = new netInternalsTest.TaskQueue(true); |
| + // Load a log and then switch to the timeline view. |
| + taskQueue.addTask( |
| + new LoadLogWithNewEventsTask( |
| + 55, 55 + graphView.scale_ * (canvas.width + expectedGraphRange))); |
| + taskQueue.addFunctionTask( |
| + netInternalsTest.switchToView.bind(null, 'timeline')); |
| + taskQueue.addFunctionTask(checkGraphRange); |
| + |
| + taskQueue.addTask(new MouseScrollTask(0)); |
| + taskQueue.addTask(new MouseScrollTask(expectedGraphRange)); |
| + taskQueue.addTask(new MouseScrollTask(1)); |
| + taskQueue.addTask(new MouseScrollTask(expectedGraphRange - 1)); |
| + |
| + taskQueue.addFunctionTask(checkGraphRange); |
| + taskQueue.addFunctionTask(sanityCheckWithTimeRange.bind(null, false)); |
| + taskQueue.run(); |
| +}); |
| + |
| +netInternalsTest.test('netInternalsTimelineViewLoadLog', function() { |
| + // After loading the log file, the rest of the test runs synchronously. |
| + function testBody() { |
| + netInternalsTest.switchToView('timeline'); |
| + sanityCheckWithTimeRange(false); |
| + |
| + // Make sure everything's still fine when we switch to another view. |
| + netInternalsTest.switchToView('events'); |
| + sanityCheckWithTimeRange(false); |
| + } |
| + |
| + // Load a log and then run the rest of the test. |
| + var taskQueue = new netInternalsTest.TaskQueue(true); |
| + taskQueue.addTask(new LoadLogWithNewEventsTask(55, 10055)); |
| + taskQueue.addFunctionTask(testBody); |
| + taskQueue.run(); |
| +}); |
| + |
| +netInternalsTest.test('netInternalsTimelineViewZoomOut', function() { |
| + // After loading the log file, the rest of the test runs synchronously. |
| + function testBody() { |
| + netInternalsTest.switchToView('timeline'); |
| + mouseZoomOut(); |
| + mouseZoomOut(); |
| + mouseZoomIn(); |
| + sanityCheckWithTimeRange(false); |
| + } |
| + |
| + // Load a log and then run the rest of the test. |
| + var taskQueue = new netInternalsTest.TaskQueue(true); |
| + taskQueue.addTask(new LoadLogWithNewEventsTask(55, 10055)); |
| + taskQueue.addFunctionTask(testBody); |
| + taskQueue.run(); |
| +}); |
| + |
| +netInternalsTest.test('netInternalsTimelineViewZoomIn', function() { |
| + // After loading the log file, the rest of the test runs synchronously. |
| + function testBody() { |
| + netInternalsTest.switchToView('timeline'); |
| + mouseZoomAllTheWayIn(); |
| + mouseZoomOut(); |
| + sanityCheckWithTimeRange(false); |
| + } |
| + |
| + // Load a log and then run the rest of the test. |
| + var taskQueue = new netInternalsTest.TaskQueue(true); |
| + taskQueue.addTask(new LoadLogWithNewEventsTask(55, 10055)); |
| + taskQueue.addFunctionTask(testBody); |
| + taskQueue.run(); |
| +}); |
| + |
| +netInternalsTest.test('netInternalsTimelineViewDegenerate', function() { |
| + // After loading the log file, the rest of the test runs synchronously. |
| + function testBody() { |
| + netInternalsTest.switchToView('timeline'); |
| + mouseZoomOut(); |
| + mouseZoomAllTheWayIn(); |
| + mouseZoomOut(); |
| + sanityCheckWithTimeRange(false); |
| + } |
| + |
| + // Load a log and then run the rest of the test. |
| + var taskQueue = new netInternalsTest.TaskQueue(true); |
| + taskQueue.addTask(new LoadLogWithNewEventsTask(55, 10055)); |
| + taskQueue.addFunctionTask(testBody); |
| + taskQueue.run(); |
| +}); |
| + |
| +/** |
| + * Since we don't need to load a log file, this test can run synchronously. |
| + */ |
| +netInternalsTest.test('netInternalsTimelineViewNoEvents', function() { |
| + // Click on delete all on events view, and then switch to timeline view. |
| + netInternalsTest.switchToView('events'); |
| + $(EventsView.DELETE_ALL_ID).click(); |
| + netInternalsTest.switchToView('timeline'); |
| + |
| + // Set startTime/endTime for sanity checks. |
| + startTime = graphView.startTime_; |
| + endTime = graphView.endTime_; |
| + |
| + sanityCheckWithTimeRange(true); |
| + |
| + mouseZoomOut(); |
| + sanityCheckWithTimeRange(true); |
| + |
| + mouseZoomAllTheWayIn(); |
| + sanityCheckWithTimeRange(true); |
| + |
| + mouseZoomOut(); |
| + sanityCheckWithTimeRange(true); |
| + |
| + testDone(); |
| +}); |
| + |
| +})(); // Anonymous namespace |
| Property changes on: chrome\test\data\webui\net_internals\timeline_view.js |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |