mirror of
https://github.com/google/blockly.git
synced 2026-01-04 15:40:08 +01:00
* Revert "fix: Auto-close widget divs on lost focus (#9216)" This reverts commitbea183d85d. * Revert "fix: Auto close drop-down divs on lost focus (reapply) (#9213)" This reverts commit0e16b0405a.
354 lines
12 KiB
HTML
354 lines
12 KiB
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<title>Mocha Tests for Blockly</title>
|
|
|
|
<link href="../../node_modules/mocha/mocha.css" rel="stylesheet" />
|
|
</head>
|
|
<style>
|
|
#blocklyDiv {
|
|
height: 1000px;
|
|
position: fixed;
|
|
visibility: hidden;
|
|
width: 1000px;
|
|
}
|
|
|
|
.blocklyActiveFocus {
|
|
outline-color: #0f0;
|
|
outline-width: 2px;
|
|
}
|
|
.blocklyPassiveFocus {
|
|
outline-color: #00f;
|
|
outline-width: 1.5px;
|
|
}
|
|
div.blocklyActiveFocus {
|
|
color: #0f0;
|
|
}
|
|
div.blocklyPassiveFocus {
|
|
color: #00f;
|
|
}
|
|
g.blocklyActiveFocus {
|
|
fill: #0f0;
|
|
}
|
|
g.blocklyPassiveFocus {
|
|
fill: #00f;
|
|
}
|
|
</style>
|
|
<body tabindex="-1">
|
|
<div id="mocha"></div>
|
|
<div id="failureCount" style="display: none" tests_failed="unset"></div>
|
|
<div id="failureMessages" style="display: none"></div>
|
|
<div id="testFocusableTree1">
|
|
Focusable tree 1
|
|
<div id="testFocusableTree1.node1" style="margin-left: 1em">
|
|
Tree 1 node 1
|
|
<div id="testFocusableTree1.node1.child1" style="margin-left: 2em">
|
|
Tree 1 node 1 child 1
|
|
<div
|
|
id="testFocusableTree1.node1.child1.unregisteredChild1"
|
|
style="margin-left: 3em">
|
|
Tree 1 node 1 child 1 child 1 (unregistered)
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="testFocusableTree1.node2" style="margin-left: 1em">
|
|
Tree 1 node 2
|
|
<div
|
|
id="testFocusableTree1.node2.unregisteredChild1"
|
|
style="margin-left: 2em">
|
|
Tree 1 node 2 child 2 (unregistered)
|
|
</div>
|
|
</div>
|
|
<div id="testFocusableTree1.unregisteredChild1" style="margin-left: 1em">
|
|
Tree 1 child 1 (unregistered)
|
|
</div>
|
|
</div>
|
|
<div id="testFocusableTree2">
|
|
Focusable tree 2
|
|
<div id="testFocusableTree2.node1" style="margin-left: 1em">
|
|
Tree 2 node 1
|
|
<div id="testFocusableNestedTree4" style="margin-left: 2em">
|
|
Nested tree 4
|
|
<div id="testFocusableNestedTree4.node1" style="margin-left: 3em">
|
|
Tree 4 node 1 (nested)
|
|
<div
|
|
id="testFocusableNestedTree4.node1.unregisteredChild1"
|
|
style="margin-left: 4em">
|
|
Tree 4 node 1 child 1 (unregistered)
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="testFocusableNestedTree5" style="margin-left: 1em">
|
|
Nested tree 5
|
|
<div id="testFocusableNestedTree5.node1" style="margin-left: 2em">
|
|
Tree 5 node 1 (nested)
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="testUnregisteredFocusableTree3">
|
|
Unregistered tree 3
|
|
<div id="testUnregisteredFocusableTree3.node1" style="margin-left: 1em">
|
|
Tree 3 node 1 (unregistered)
|
|
</div>
|
|
</div>
|
|
<div id="testUnfocusableElement">Unfocusable element</div>
|
|
<div id="nonTreeElementForEphemeralFocus" />
|
|
<svg width="250" height="250">
|
|
<g id="testFocusableGroup1">
|
|
<g id="testFocusableGroup1.node1">
|
|
<rect x="0" y="0" width="250" height="30" fill="grey" />
|
|
<text x="10" y="20" class="svgText">Group 1 node 1</text>
|
|
<g id="testFocusableGroup1.node1.child1">
|
|
<rect x="0" y="30" width="250" height="30" fill="lightgrey" />
|
|
<text x="10" y="50" class="svgText">Tree 1 node 1 child 1</text>
|
|
</g>
|
|
</g>
|
|
<g id="testFocusableGroup1.node2">
|
|
<rect x="0" y="60" width="250" height="30" fill="grey" />
|
|
<text x="10" y="80" class="svgText">Group 1 node 2</text>
|
|
<g id="testFocusableGroup1.node2.unregisteredChild1">
|
|
<rect x="0" y="90" width="250" height="30" fill="lightgrey" />
|
|
<text x="10" y="110" class="svgText">
|
|
Tree 1 node 2 child 2 (unregistered)
|
|
</text>
|
|
</g>
|
|
</g>
|
|
</g>
|
|
<g id="testFocusableGroup2">
|
|
<g id="testFocusableGroup2.node1">
|
|
<rect x="0" y="120" width="250" height="30" fill="grey" />
|
|
<text x="10" y="140" class="svgText">Group 2 node 1</text>
|
|
</g>
|
|
<g id="testFocusableNestedGroup4">
|
|
<g id="testFocusableNestedGroup4.node1">
|
|
<rect x="0" y="150" width="250" height="30" fill="lightgrey" />
|
|
<text x="10" y="170" class="svgText">Group 4 node 1 (nested)</text>
|
|
</g>
|
|
</g>
|
|
</g>
|
|
<g id="testUnregisteredFocusableGroup3">
|
|
<g id="testUnregisteredFocusableGroup3.node1">
|
|
<rect x="0" y="180" width="250" height="30" fill="grey" />
|
|
<text x="10" y="200" class="svgText">
|
|
Tree 3 node 1 (unregistered)
|
|
</text>
|
|
</g>
|
|
</g>
|
|
<g id="nonTreeGroupForEphemeralFocus"></g>
|
|
</svg>
|
|
<!-- Load mocha et al. before Blockly and the test modules so that
|
|
we can safely import the test modules that make calls
|
|
to (e.g.) suite() at the top level. -->
|
|
<script src="../../node_modules/mocha/mocha.js"></script>
|
|
<script src="../../node_modules/sinon/pkg/sinon.js"></script>
|
|
<script>
|
|
mocha.setup({
|
|
ui: 'tdd',
|
|
failZero: true,
|
|
});
|
|
</script>
|
|
|
|
<script type="module">
|
|
import {loadScript} from '../scripts/load.mjs';
|
|
|
|
// Load Blockly in uncompressed mode.
|
|
import * as Blockly from '../../build/blockly.loader.mjs';
|
|
import '../../build/blocks.loader.mjs';
|
|
import {javascriptGenerator} from '../../build/javascript.loader.mjs';
|
|
|
|
// Import tests.
|
|
import './block_json_test.js';
|
|
import './block_test.js';
|
|
import './clipboard_test.js';
|
|
import './comment_test.js';
|
|
import './comment_deserialization_test.js';
|
|
import './connection_checker_test.js';
|
|
import './connection_db_test.js';
|
|
import './connection_test.js';
|
|
import './contextmenu_items_test.js';
|
|
import './contextmenu_test.js';
|
|
import './cursor_test.js';
|
|
import './dialog_test.js';
|
|
import './dropdowndiv_test.js';
|
|
import './event_test.js';
|
|
import './event_block_change_test.js';
|
|
import './event_block_create_test.js';
|
|
import './event_block_delete_test.js';
|
|
import './event_block_drag_test.js';
|
|
import './event_block_field_intermediate_change_test.js';
|
|
import './event_block_move_test.js';
|
|
import './event_bubble_open_test.js';
|
|
import './event_click_test.js';
|
|
import './event_comment_change_test.js';
|
|
import './event_comment_collapse_test.js';
|
|
import './event_comment_create_test.js';
|
|
import './event_comment_delete_test.js';
|
|
import './event_comment_move_test.js';
|
|
import './event_comment_drag_test.js';
|
|
import './event_comment_resize_test.js';
|
|
import './event_selected_test.js';
|
|
import './event_theme_change_test.js';
|
|
import './event_toolbox_item_select_test.js';
|
|
import './event_trashcan_open_test.js';
|
|
import './event_var_create_test.js';
|
|
import './event_var_delete_test.js';
|
|
import './event_var_rename_test.js';
|
|
import './event_var_type_change_test.js';
|
|
import './event_viewport_test.js';
|
|
import './extensions_test.js';
|
|
import './field_checkbox_test.js';
|
|
import './field_dropdown_test.js';
|
|
import './field_image_test.js';
|
|
import './field_label_serializable_test.js';
|
|
import './field_label_test.js';
|
|
import './field_number_test.js';
|
|
import './field_registry_test.js';
|
|
import './field_test.js';
|
|
import './field_textinput_test.js';
|
|
import './field_variable_test.js';
|
|
import './flyout_test.js';
|
|
import './focus_manager_test.js';
|
|
import './focusable_tree_traverser_test.js';
|
|
import './generator_test.js';
|
|
import './gesture_test.js';
|
|
import './icon_test.js';
|
|
import './input_test.js';
|
|
import './insertion_marker_test.js';
|
|
import './jso_deserialization_test.js';
|
|
import './jso_serialization_test.js';
|
|
import './json_test.js';
|
|
import './keyboard_navigation_controller_test.js';
|
|
import './layering_test.js';
|
|
import './blocks/lists_test.js';
|
|
import './blocks/logic_ternary_test.js';
|
|
import './blocks/loops_test.js';
|
|
import './metrics_test.js';
|
|
import './mutator_test.js';
|
|
import './names_test.js';
|
|
import './navigation_test.js';
|
|
// TODO: Remove these tests.
|
|
import './old_workspace_comment_test.js';
|
|
import './procedure_map_test.js';
|
|
import './blocks/procedures_test.js';
|
|
import './rect_test.js';
|
|
import './registry_test.js';
|
|
import './render_management_test.js';
|
|
import './serializer_test.js';
|
|
import './shortcut_items_test.js';
|
|
import './shortcut_registry_test.js';
|
|
import './touch_test.js';
|
|
import './theme_test.js';
|
|
import './toast_test.js';
|
|
import './toolbox_test.js';
|
|
import './tooltip_test.js';
|
|
import './trashcan_test.js';
|
|
import './utils_test.js';
|
|
import './variable_map_test.js';
|
|
import './variable_model_test.js';
|
|
import './blocks/variables_test.js';
|
|
import './widget_div_test.js';
|
|
import './comment_view_test.js';
|
|
import './workspace_comment_test.js';
|
|
import './workspace_svg_test.js';
|
|
import './workspace_test.js';
|
|
import './xml_test.js';
|
|
import './zoom_controls_test.js';
|
|
|
|
// Make Blockly and generators available via global scope.
|
|
globalThis.Blockly = Blockly;
|
|
globalThis.javascriptGenerator = javascriptGenerator;
|
|
|
|
// Load additional scripts.
|
|
await loadScript('../../build/msg/en.js');
|
|
await loadScript('../playgrounds/screenshot.js');
|
|
await loadScript('../../node_modules/@blockly/dev-tools/dist/index.js');
|
|
|
|
let runner = mocha.run(function (failures) {
|
|
var failureDiv = document.getElementById('failureCount');
|
|
failureDiv.setAttribute('tests_failed', failures);
|
|
});
|
|
runner.on('fail', function (test, err) {
|
|
const msg = document.createElement('p');
|
|
msg.textContent = `"${test.fullTitle()}" failed: ${err.message}`;
|
|
const div = document.getElementById('failureMessages');
|
|
div.appendChild(msg);
|
|
});
|
|
</script>
|
|
|
|
<div id="blocklyDiv"></div>
|
|
|
|
<xml
|
|
xmlns="https://developers.google.com/blockly/xml"
|
|
id="toolbox-simple"
|
|
style="display: none">
|
|
<block type="logic_compare">
|
|
<field name="OP">NEQ</field>
|
|
<value name="A">
|
|
<shadow type="math_number">
|
|
<field name="NUM">1</field>
|
|
</shadow>
|
|
</value>
|
|
<value name="B">
|
|
<block type="math_number">
|
|
<field name="NUM">2</field>
|
|
</block>
|
|
</value>
|
|
</block>
|
|
<sep gap="20"></sep>
|
|
<button text="insert" callbackkey="insertConnectionRows"></button>
|
|
<label text="tooltips"></label>
|
|
</xml>
|
|
|
|
<xml
|
|
xmlns="https://developers.google.com/blockly/xml"
|
|
id="toolbox-categories"
|
|
style="display: none">
|
|
<category name="First" css-container="something">
|
|
<block type="basic_block">
|
|
<field name="TEXT">FirstCategory-FirstBlock</field>
|
|
</block>
|
|
<block type="basic_block">
|
|
<field name="TEXT">FirstCategory-SecondBlock</field>
|
|
</block>
|
|
</category>
|
|
<category name="Second">
|
|
<block type="basic_block">
|
|
<field name="TEXT">SecondCategory-FirstBlock</field>
|
|
</block>
|
|
</category>
|
|
</xml>
|
|
|
|
<xml
|
|
xmlns="https://developers.google.com/blockly/xml"
|
|
id="toolbox-test"
|
|
style="display: none">
|
|
<category name="First" expanded="true" categorystyle="logic_category">
|
|
<sep gap="-1"></sep>
|
|
<button text="insert" callbackkey="insertConnectionRows"></button>
|
|
<block type="stack_block"></block>
|
|
<block type="stack_block"></block>
|
|
</category>
|
|
<category name="Second">
|
|
<block type="stack_block"></block>
|
|
</category>
|
|
<sep toolboxitemid="separator" gap="-1"></sep>
|
|
<category name="Variables" custom="VARIABLE"></category>
|
|
<category name="NestedCategory">
|
|
<category
|
|
toolboxitemid="nestedCategory"
|
|
name="NestedItemOne"></category>
|
|
</category>
|
|
<category name="lastItem"></category>
|
|
</xml>
|
|
|
|
<xml
|
|
xmlns="https://developers.google.com/blockly/xml"
|
|
id="gesture-test-toolbox"
|
|
style="display: none">
|
|
<block type="test_field_block"></block>
|
|
</xml>
|
|
</body>
|
|
</html>
|