1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/devtools/framework/test/browser_devtools_api.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,128 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +// Tests devtools API 1.8 + 1.9 +const Cu = Components.utils; 1.10 +const toolId = "test-tool"; 1.11 + 1.12 +let tempScope = {}; 1.13 +Cu.import("resource://gre/modules/devtools/event-emitter.js", tempScope); 1.14 +let EventEmitter = tempScope.EventEmitter; 1.15 + 1.16 +function test() { 1.17 + addTab("about:blank", function(aBrowser, aTab) { 1.18 + runTests(aTab); 1.19 + }); 1.20 +} 1.21 + 1.22 +function runTests(aTab) { 1.23 + let toolDefinition = { 1.24 + id: toolId, 1.25 + isTargetSupported: function() true, 1.26 + visibilityswitch: "devtools.test-tool.enabled", 1.27 + url: "about:blank", 1.28 + label: "someLabel", 1.29 + build: function(iframeWindow, toolbox) { 1.30 + let panel = new DevToolPanel(iframeWindow, toolbox); 1.31 + return panel.open(); 1.32 + }, 1.33 + }; 1.34 + 1.35 + ok(gDevTools, "gDevTools exists"); 1.36 + is(gDevTools.getToolDefinitionMap().has(toolId), false, 1.37 + "The tool is not registered"); 1.38 + 1.39 + gDevTools.registerTool(toolDefinition); 1.40 + is(gDevTools.getToolDefinitionMap().has(toolId), true, 1.41 + "The tool is registered"); 1.42 + 1.43 + let target = TargetFactory.forTab(gBrowser.selectedTab); 1.44 + gDevTools.showToolbox(target, toolId).then(function(toolbox) { 1.45 + is(toolbox.target, target, "toolbox target is correct"); 1.46 + is(toolbox._host.hostTab, gBrowser.selectedTab, "toolbox host is correct"); 1.47 + continueTests(toolbox); 1.48 + }).then(null, console.error); 1.49 +} 1.50 + 1.51 +function continueTests(toolbox, panel) { 1.52 + ok(toolbox.getCurrentPanel(), "panel value is correct"); 1.53 + is(toolbox.currentToolId, toolId, "toolbox _currentToolId is correct"); 1.54 + 1.55 + ok(!toolbox.doc.getElementById("toolbox-tab-" + toolId).hasAttribute("icon-invertable"), 1.56 + "The tool tab does not have the invertable attribute"); 1.57 + 1.58 + ok(toolbox.doc.getElementById("toolbox-tab-inspector").hasAttribute("icon-invertable"), 1.59 + "The builtin tool tabs do have the invertable attribute"); 1.60 + 1.61 + let toolDefinitions = gDevTools.getToolDefinitionMap(); 1.62 + is(toolDefinitions.has(toolId), true, "The tool is in gDevTools"); 1.63 + 1.64 + let toolDefinition = toolDefinitions.get(toolId); 1.65 + is(toolDefinition.id, toolId, "toolDefinition id is correct"); 1.66 + 1.67 + gDevTools.unregisterTool(toolId); 1.68 + is(gDevTools.getToolDefinitionMap().has(toolId), false, 1.69 + "The tool is no longer registered"); 1.70 + 1.71 + toolbox.destroy().then(function() { 1.72 + let target = TargetFactory.forTab(gBrowser.selectedTab); 1.73 + ok(gDevTools._toolboxes.get(target) == null, "gDevTools doesn't know about target"); 1.74 + ok(toolbox._target == null, "toolbox doesn't know about target."); 1.75 + 1.76 + finishUp(); 1.77 + }).then(null, console.error); 1.78 +} 1.79 + 1.80 +function finishUp() { 1.81 + tempScope = null; 1.82 + gBrowser.removeCurrentTab(); 1.83 + finish(); 1.84 +} 1.85 + 1.86 +/** 1.87 +* When a Toolbox is started it creates a DevToolPanel for each of the tools 1.88 +* by calling toolDefinition.build(). The returned object should 1.89 +* at least implement these functions. They will be used by the ToolBox. 1.90 +* 1.91 +* There may be no benefit in doing this as an abstract type, but if nothing 1.92 +* else gives us a place to write documentation. 1.93 +*/ 1.94 +function DevToolPanel(iframeWindow, toolbox) { 1.95 + EventEmitter.decorate(this); 1.96 + 1.97 + this._toolbox = toolbox; 1.98 + 1.99 + /*let doc = iframeWindow.document 1.100 + let label = doc.createElement("label"); 1.101 + let textNode = doc.createTextNode("Some Tool"); 1.102 + 1.103 + label.appendChild(textNode); 1.104 + doc.body.appendChild(label);*/ 1.105 +} 1.106 + 1.107 +DevToolPanel.prototype = { 1.108 + open: function() { 1.109 + let deferred = promise.defer(); 1.110 + 1.111 + executeSoon(function() { 1.112 + this._isReady = true; 1.113 + this.emit("ready"); 1.114 + deferred.resolve(this); 1.115 + }.bind(this)); 1.116 + 1.117 + return deferred.promise; 1.118 + }, 1.119 + 1.120 + get target() this._toolbox.target, 1.121 + 1.122 + get toolbox() this._toolbox, 1.123 + 1.124 + get isReady() this._isReady, 1.125 + 1.126 + _isReady: false, 1.127 + 1.128 + destroy: function DTI_destroy() { 1.129 + return promise.defer(null); 1.130 + }, 1.131 +};