Inject can now take an ID. Also, fix unit tests.

This commit is contained in:
Neil Fraser 2015-04-29 20:26:04 -07:00
parent 9924498485
commit 3ff69d47fe
17 changed files with 57 additions and 58 deletions

View file

@ -1320,8 +1320,8 @@ Blockly.WidgetDiv={};Blockly.WidgetDiv.DIV=null;Blockly.WidgetDiv.owner_=null;Bl
Blockly.WidgetDiv.hide=function(){Blockly.WidgetDiv.owner_&&(Blockly.WidgetDiv.DIV.style.display="none",Blockly.WidgetDiv.dispose_&&Blockly.WidgetDiv.dispose_(),Blockly.WidgetDiv.owner_=null,Blockly.WidgetDiv.dispose_=null,goog.dom.removeChildren(Blockly.WidgetDiv.DIV))};Blockly.WidgetDiv.isVisible=function(){return!!Blockly.WidgetDiv.owner_};Blockly.WidgetDiv.hideIfOwner=function(a){Blockly.WidgetDiv.owner_==a&&Blockly.WidgetDiv.hide()};
Blockly.WidgetDiv.position=function(a,b,c,d,e){b<d.y&&(b=d.y);e?a>c.width+d.x&&(a=c.width+d.x):a<d.x&&(a=d.x);Blockly.WidgetDiv.DIV.style.left=a+"px";Blockly.WidgetDiv.DIV.style.top=b+"px"};
// Copyright 2011 Google Inc. Apache License 2.0
Blockly.inject=function(a,b){if(!goog.dom.contains(document,a))throw"Error: container is not in current document.";var c=Blockly.parseOptions_(b||{}),d,e=function(){var b=Blockly.createDom_(a,c);d=Blockly.createMainWorkspace_(b,c);Blockly.init_(d);d.markFocused();Blockly.bindEvent_(b,"focus",d,d.markFocused)};if(c.enableRealtime){var f=document.getElementById("realtime");f&&(f.style.display="block");Blockly.Realtime.startRealtime(e,a,c.realtimeOptions)}else e();return d};
Blockly.parseToolboxTree_=function(a){a?("string"!=typeof a&&"undefined"==typeof XSLTProcessor&&(a=a.outerHTML),"string"==typeof a&&(a=Blockly.Xml.textToDom(a))):a=null;return a};
Blockly.inject=function(a,b){goog.isString(a)&&(a=document.getElementById(a));if(!goog.dom.contains(document,a))throw"Error: container is not in current document.";var c=Blockly.parseOptions_(b||{}),d,e=function(){goog.dom.removeChildren(a);var b=Blockly.createDom_(a,c);d=Blockly.createMainWorkspace_(b,c);Blockly.init_(d);d.markFocused();Blockly.bindEvent_(b,"focus",d,d.markFocused)};if(c.enableRealtime){var f=document.getElementById("realtime");f&&(f.style.display="block");Blockly.Realtime.startRealtime(e,
a,c.realtimeOptions)}else e();return d};Blockly.parseToolboxTree_=function(a){a?("string"!=typeof a&&"undefined"==typeof XSLTProcessor&&(a=a.outerHTML),"string"==typeof a&&(a=Blockly.Xml.textToDom(a))):a=null;return a};
Blockly.parseOptions_=function(a){var b=!!a.readOnly;if(b)var c=null,d=!1,e=!1,f=!1,g=!1,h=!1,k=!1;else c=Blockly.parseToolboxTree_(a.toolbox),d=Boolean(c&&c.getElementsByTagName("category").length),e=a.trashcan,void 0===e&&(e=d),f=a.collapse,void 0===f&&(f=d),g=a.comments,void 0===g&&(g=d),h=a.disable,void 0===h&&(h=d),k=a.sounds,void 0===k&&(k=!0);var l=a.scrollbars;void 0===l&&(l=d);var p=a.css;void 0===p&&(p=!0);var m=a.grid||{};m.spacing=m.spacing?parseFloat(m.spacing):0;m.colour||(m.colour=
"#888");m.length=m.length?parseFloat(m.length):1;m.snap=!!m.snap;var q="https://blockly-demo.appspot.com/static/media/";a.media?q=a.media:a.path&&(q=a.path+"media/");var n=!!a.realtime;return{RTL:!!a.rtl,collapse:f,comments:g,disable:h,readOnly:b,maxBlocks:a.maxBlocks||Infinity,pathToMedia:q,hasCategories:d,hasScrollbars:l,hasTrashcan:e,hasSounds:k,hasCss:p,languageTree:c,gridOptions:m,enableRealtime:n,realtimeOptions:n?a.realtimeOptions:void 0}};
Blockly.createDom_=function(a,b){a.setAttribute("dir","LTR");goog.ui.Component.setDefaultRightToLeft(b.RTL);Blockly.Css.inject(b.hasCss,b.pathToMedia);var c=Blockly.createSvgElement("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:html":"http://www.w3.org/1999/xhtml","xmlns:xlink":"http://www.w3.org/1999/xlink",version:"1.1","class":"blocklySvg"},a),d=Blockly.createSvgElement("defs",{},c),e,f;e=Blockly.createSvgElement("filter",{id:"blocklyEmboss"},d);Blockly.createSvgElement("feGaussianBlur",{"in":"SourceAlpha",

View file

@ -34,12 +34,15 @@ goog.require('goog.userAgent');
/**
* Inject a Blockly editor into the specified container DIV.
* @param {!Element} container Containing element.
* Inject a Blockly editor into the specified container element (usually a div).
* @param {!Element|string} container Containing element or its ID.
* @param {Object} opt_options Optional dictionary of options.
* @return {!Blockly.Workspace} Newly created main workspace.
*/
Blockly.inject = function(container, opt_options) {
if (goog.isString(container)) {
container = document.getElementById(container);
}
// Verify that the container is in document.
if (!goog.dom.contains(document, container)) {
throw 'Error: container is not in current document.';
@ -47,6 +50,7 @@ Blockly.inject = function(container, opt_options) {
var options = Blockly.parseOptions_(opt_options || {});
var workspace;
var startUi = function() {
goog.dom.removeChildren(container);
var svg = Blockly.createDom_(container, options);
workspace = Blockly.createMainWorkspace_(svg, options);
Blockly.init_(workspace);

View file

@ -396,10 +396,8 @@ var oldDir = null;
function updatePreview() {
var newDir = document.getElementById('direction').value;
if (oldDir != newDir) {
var previewDiv = document.getElementById('preview');
previewDiv.innerHTML = '';
var rtl = newDir == 'rtl';
previewWorkspace = Blockly.inject(previewDiv, {rtl: rtl});
previewWorkspace = Blockly.inject('preview', {rtl: rtl});
oldDir = newDir;
}
var code = document.getElementById('languagePre').textContent;
@ -481,8 +479,7 @@ function init() {
window.addEventListener('resize', onresize);
var toolbox = document.getElementById('toolbox');
mainWorkspace =
Blockly.inject(document.getElementById('blockly'), {toolbox: toolbox});
mainWorkspace = Blockly.inject('blockly', {toolbox: toolbox});
// Create the root block.
if ('BlocklyStorage' in window && window.location.hash.length > 1) {

View file

@ -372,7 +372,7 @@ Code.init = function() {
window.addEventListener('resize', onresize, false);
var toolbox = document.getElementById('toolbox');
Code.workspace = Blockly.inject(document.getElementById('content_blocks'),
Code.workspace = Blockly.inject('content_blocks',
{grid:
{spacing: 25,
length: 3,

View file

@ -38,7 +38,7 @@
</xml>
<script>
Blockly.inject(document.getElementById('blocklyDiv'),
var workspace = Blockly.inject('blocklyDiv',
{toolbox: document.getElementById('toolbox')});
</script>

View file

@ -113,7 +113,7 @@
</xml>
<script>
var workspace = Blockly.inject(document.getElementById('blocklyDiv'),
var workspace = Blockly.inject('blocklyDiv',
{toolbox: document.getElementById('toolbox')});
Blockly.Xml.domToWorkspace(workspace,
document.getElementById('startBlocks'));

View file

@ -269,7 +269,7 @@ Graph.resize = function() {
* Initialize Blockly and the graph. Called on page load.
*/
Graph.init = function() {
Graph.workspace = Blockly.inject(document.getElementById('blocklyDiv'),
Graph.workspace = Blockly.inject('blocklyDiv',
{toolbox: document.getElementById('toolbox')});
Blockly.Xml.domToWorkspace(Graph.workspace,
document.getElementById('startBlocks'));

View file

@ -121,7 +121,7 @@
</xml>
<script>
var workspace = Blockly.inject(document.getElementById('blocklyDiv'),
var workspace = Blockly.inject('blocklyDiv',
{toolbox: document.getElementById('toolbox')});
Blockly.Xml.domToWorkspace(workspace,
document.getElementById('startBlocks'));

View file

@ -79,7 +79,7 @@
</xml>
<script>
var workspace = Blockly.inject(document.getElementById('blocklyDiv'),
var workspace = Blockly.inject('blocklyDiv',
{maxBlocks: 5, toolbox: document.getElementById('toolbox')});
function onchange() {

View file

@ -262,7 +262,7 @@ Plane.init = function() {
'width=725, initial-scale=.35, user-scalable=no');
}
Plane.workspace = Blockly.inject(document.getElementById('blockly'),
Plane.workspace = Blockly.inject('blockly',
{media: '../../media/',
rtl: Plane.isRtl(),
toolbox: document.getElementById('toolbox')});

View file

@ -16,14 +16,14 @@
font-weight: normal;
font-size: 140%;
}
#svgDiv {
#blocklyDiv {
height: 600px;
width: 800px;
}
</style>
<script>
function init() {
var workspace = Blockly.inject(document.getElementById('svgDiv'),
var workspace = Blockly.inject('blocklyDiv',
{rtl: true, toolbox: document.getElementById('toolbox')});
Blockly.Xml.domToWorkspace(workspace,
document.getElementById('startBlocks'));
@ -37,7 +37,7 @@
<h1><a href="https://developers.google.com/blockly/">Blockly</a> &gt;
<a href="../index.html">Demos</a> &gt; Right-to-Left</h1>
<div id="svgDiv"></div>
<div id="blocklyDiv"></div>
<xml id="toolbox" style="display: none">
<category name="منطق">

View file

@ -80,7 +80,7 @@
</xml>
<script>
Blockly.inject(document.getElementById('blocklyDiv'),
var workspace = Blockly.inject('blocklyDiv',
{toolbox: document.getElementById('toolbox')});
// An href with #key trigers an AJAX call to retrieve saved blocks.

View file

@ -341,7 +341,7 @@
</xml>
<script>
Blockly.inject(document.getElementById('blocklyDiv'),
var workspace = Blockly.inject('blocklyDiv',
{toolbox: document.getElementById('toolbox')});
</script>

View file

@ -47,10 +47,11 @@
<script>
'use strict';
var workspace = null;
function start() {
var toolbox = document.getElementById('toolbox');
Blockly.inject(document.getElementById('svg'),
{media: '../../media/', toolbox: toolbox});
workspace = Blockly.inject('blocklyDiv',
{media: '../../media/', toolbox: document.getElementById('toolbox')});
}
function loadXml() {
@ -91,14 +92,14 @@ function fetchFile(xmlUrl) {
function fromXml(xmlText) {
var output = document.getElementById('importExport');
output.value = xmlText;
Blockly.mainWorkspace.clear();
workspace.clear();
try {
var xmlDoc = Blockly.Xml.textToDom(xmlText);
} catch (e) {
alert('Error parsing XML:\n' + e);
return;
}
Blockly.Xml.domToWorkspace(Blockly.mainWorkspace, xmlDoc);
Blockly.Xml.domToWorkspace(workspace, xmlDoc);
}
function setOutput(text) {
@ -109,24 +110,24 @@ function setOutput(text) {
}
function toXml() {
var xmlDom = Blockly.Xml.workspaceToDom(Blockly.mainWorkspace);
var xmlDom = Blockly.Xml.workspaceToDom(workspace);
var xmlText = Blockly.Xml.domToPrettyText(xmlDom);
setOutput(xmlText);
}
function toJavaScript() {
var code = '\'use strict\';\n\n'
code += Blockly.JavaScript.workspaceToCode();
code += Blockly.JavaScript.workspaceToCode(workspace);
setOutput(code);
}
function toPython() {
var code = Blockly.Python.workspaceToCode();
var code = Blockly.Python.workspaceToCode(workspace);
setOutput(code);
}
function toDart() {
var code = Blockly.Dart.workspaceToCode();
var code = Blockly.Dart.workspaceToCode(workspace);
setOutput(code);
}
</script>
@ -145,15 +146,12 @@ h1 {
font-weight: normal;
font-size: 140%;
}
#svg {
#blocklyDiv {
float: right;
height: 95%;
width: 69%;
margin-top: 5px;
}
.blocklySvg {
border: 1px solid #000;
}
#importExport {
height: 100%;
width: 100%;
@ -162,7 +160,7 @@ h1 {
</head>
<body onload="start()">
<div id="svg"></div>
<div id="blocklyDiv"></div>
<xml id="toolbox" style="display: none">
<category name="Unit test">

View file

@ -38,35 +38,35 @@ function verify_DB_(msg, expected, db) {
function test_DB_addConnection() {
var db = new Blockly.ConnectionDB();
var o2 = {y_: 2};
var o2 = {y_: 2, sourceBlock_: {}};
db.addConnection_(o2);
verify_DB_('Adding connection #2', [o2], db);
var o4 = {y_: 4};
var o4 = {y_: 4, sourceBlock_: {}};
db.addConnection_(o4);
verify_DB_('Adding connection #4', [o2, o4], db);
var o1 = {y_: 1};
var o1 = {y_: 1, sourceBlock_: {}};
db.addConnection_(o1);
verify_DB_('Adding connection #1', [o1, o2, o4], db);
var o3a = {y_: 3};
var o3a = {y_: 3, sourceBlock_: {}};
db.addConnection_(o3a);
verify_DB_('Adding connection #3a', [o1, o2, o3a, o4], db);
var o3b = {y_: 3};
var o3b = {y_: 3, sourceBlock_: {}};
db.addConnection_(o3b);
verify_DB_('Adding connection #3b', [o1, o2, o3b, o3a, o4], db);
}
function test_DB_removeConnection() {
var db = new Blockly.ConnectionDB();
var o1 = {y_: 1};
var o2 = {y_: 2};
var o3a = {y_: 3};
var o3b = {y_: 3};
var o3c = {y_: 3};
var o4 = {y_: 4};
var o1 = {y_: 1, sourceBlock_: {}};
var o2 = {y_: 2, sourceBlock_: {}};
var o3a = {y_: 3, sourceBlock_: {}};
var o3b = {y_: 3, sourceBlock_: {}};
var o3c = {y_: 3, sourceBlock_: {}};
var o4 = {y_: 4, sourceBlock_: {}};
db.addConnection_(o1);
db.addConnection_(o2);
db.addConnection_(o3c);

View file

@ -55,13 +55,13 @@ function test_maxBlocksWorkspace() {
var blockA = Blockly.Block.obtain(workspace, '');
var blockB = Blockly.Block.obtain(workspace, '');
assertEquals('Infinite capacity.', Infinity, workspace.remainingCapacity());
workspace.maxBlocks = 3;
workspace.options.maxBlocks = 3;
assertEquals('Three capacity.', 1, workspace.remainingCapacity());
workspace.maxBlocks = 2;
workspace.options.maxBlocks = 2;
assertEquals('Two capacity.', 0, workspace.remainingCapacity());
workspace.maxBlocks = 1;
workspace.options.maxBlocks = 1;
assertEquals('One capacity.', -1, workspace.remainingCapacity());
workspace.maxBlocks = 0;
workspace.options.maxBlocks = 0;
assertEquals('Zero capacity.', -2, workspace.remainingCapacity());
workspace.clear();
assertEquals('Cleared capacity.', 0, workspace.remainingCapacity());

View file

@ -46,7 +46,7 @@
'use strict';
// Depending on the URL argument, render as LTR or RTL.
var rtl = (document.location.search == '?rtl');
var block = null;
var workspace = null;
function enableRealtimeSpecificUi() {
var realtimeDiv = document.getElementById('realtime');
@ -55,7 +55,7 @@ function enableRealtimeSpecificUi() {
function start() {
var toolbox = document.getElementById('toolbox');
Blockly.inject(document.getElementById('blocklyDiv'),
workspace = Blockly.inject('blocklyDiv',
{rtl: rtl,
media: '../media/',
toolbox: toolbox,
@ -82,7 +82,7 @@ function start() {
function toXml() {
var output = document.getElementById('importExport');
var xml = Blockly.Xml.workspaceToDom(Blockly.mainWorkspace);
var xml = Blockly.Xml.workspaceToDom(workspace);
output.value = Blockly.Xml.domToPrettyText(xml);
output.focus();
output.select();
@ -91,12 +91,12 @@ function toXml() {
function fromXml() {
var input = document.getElementById('importExport');
var xml = Blockly.Xml.textToDom(input.value);
Blockly.Xml.domToWorkspace(Blockly.mainWorkspace, xml);
Blockly.Xml.domToWorkspace(workspace, xml);
}
function toCode(lang) {
var output = document.getElementById('importExport');
output.value = Blockly[lang].workspaceToCode();
output.value = Blockly[lang].workspaceToCode(workspace);
}
function airstrike(n) {
@ -108,7 +108,7 @@ function airstrike(n) {
}
for (var i = 0; i < n; i++) {
var prototype = prototypes[Math.floor(Math.random() * prototypes.length)];
var block = Blockly.Block.obtain(Blockly.mainWorkspace, prototype);
var block = Blockly.Block.obtain(workspace, prototype);
block.initSvg();
block.getSvgRoot().setAttribute('transform', 'translate(' +
Math.round(Math.random() * 450 + 40) + ', ' +
@ -126,7 +126,7 @@ function spaghetti(n) {
xml = '<xml xmlns="http://www.w3.org/1999/xhtml">' + xml + '</xml>';
var dom = Blockly.Xml.textToDom(xml);
console.time('Spaghetti domToWorkspace');
Blockly.Xml.domToWorkspace(Blockly.mainWorkspace, dom);
Blockly.Xml.domToWorkspace(workspace, dom);
console.timeEnd('Spaghetti domToWorkspace');
}
var spaghettiXml = [
@ -418,7 +418,7 @@ h1 {
<h1>Blockly Playground</h1>
<p><a href="javascript:void([document.getElementById('blocklyDiv').style.display = 'block', Blockly.mainWorkspace.render()])">Show</a>
<p><a href="javascript:void([document.getElementById('blocklyDiv').style.display = 'block', workspace.render()])">Show</a>
- <a href="javascript:void(document.getElementById('blocklyDiv').style.display = 'none')">Hide</a></p>
<script>