diff --git a/core/blockly.ts b/core/blockly.ts index 81064ede5..c91d23294 100644 --- a/core/blockly.ts +++ b/core/blockly.ts @@ -98,6 +98,7 @@ import {IFlyout} from './interfaces/i_flyout.js'; import {IKeyboardAccessible} from './interfaces/i_keyboard_accessible.js'; import {IMetricsManager} from './interfaces/i_metrics_manager.js'; import {IMovable} from './interfaces/i_movable.js'; +import {IObservable, isObservable} from './interfaces/i_observable.js'; import {IPositionable} from './interfaces/i_positionable.js'; import {IRegistrable} from './interfaces/i_registrable.js'; import {ISelectable} from './interfaces/i_selectable.js'; @@ -690,6 +691,7 @@ export {IMetricsManager}; export {IMovable}; export {Input}; export {InsertionMarkerManager}; +export {IObservable, isObservable}; export {IPositionable}; export {IRegistrable}; export {ISelectable}; diff --git a/core/procedures/observable_procedure_map.ts b/core/observable_procedure_map.ts similarity index 67% rename from core/procedures/observable_procedure_map.ts rename to core/observable_procedure_map.ts index 5bffb8bbf..8105c905e 100644 --- a/core/procedures/observable_procedure_map.ts +++ b/core/observable_procedure_map.ts @@ -4,17 +4,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -import * as eventUtils from '../events/utils.js'; -import {IProcedureMap} from '../interfaces/i_procedure_map.js'; -import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; -import {isObservable} from '../interfaces/i_observable.js'; -import {triggerProceduresUpdate} from './update_procedures.js'; -import type {Workspace} from '../workspace.js'; +import {IProcedureMap} from './interfaces/i_procedure_map.js'; +import type {IProcedureModel} from './interfaces/i_procedure_model.js'; +import {isObservable} from './interfaces/i_observable.js'; export class ObservableProcedureMap extends Map implements IProcedureMap { - constructor(private readonly workspace: Workspace) { + /** @internal */ + constructor() { super(); } @@ -36,7 +34,6 @@ export class ObservableProcedureMap extends const proc = this.get(id); const existed = super.delete(id); if (!existed) return existed; - triggerProceduresUpdate(this.workspace); if (isObservable(proc)) proc.stopPublishing(); return existed; } @@ -47,10 +44,8 @@ export class ObservableProcedureMap extends override clear() { if (!this.size) return; for (const id of this.keys()) { - const proc = this.get(id); - super.delete(id); + this.delete(id); } - triggerProceduresUpdate(this.workspace); } /** @@ -58,7 +53,6 @@ export class ObservableProcedureMap extends * blocks can find it. */ add(proc: IProcedureModel): this { - // TODO(#6526): See if this method is actually useful. return this.set(proc.getId(), proc); } diff --git a/core/procedures.ts b/core/procedures.ts index 8a976016f..cd36b660b 100644 --- a/core/procedures.ts +++ b/core/procedures.ts @@ -29,8 +29,7 @@ import {IParameterModel} from './interfaces/i_parameter_model.js'; import {IProcedureMap} from './interfaces/i_procedure_map.js'; import {IProcedureModel} from './interfaces/i_procedure_model.js'; import {IProcedureBlock, isProcedureBlock} from './interfaces/i_procedure_block.js'; -import {ObservableProcedureMap} from './procedures/observable_procedure_map.js'; -import {triggerProceduresUpdate} from './procedures/update_procedures.js'; +import {ObservableProcedureMap} from './observable_procedure_map.js'; import * as utilsXml from './utils/xml.js'; import * as Variables from './variables.js'; import type {Workspace} from './workspace.js'; @@ -500,7 +499,6 @@ export function getDefinition(name: string, workspace: Workspace): Block|null { export { ObservableProcedureMap, - triggerProceduresUpdate, IParameterModel, IProcedureBlock, isProcedureBlock, diff --git a/core/procedures/update_procedures.ts b/core/procedures/update_procedures.ts deleted file mode 100644 index fae2ed4c4..000000000 --- a/core/procedures/update_procedures.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @license - * Copyright 2022 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -import * as goog from '../../closure/goog/goog.js'; -import {isProcedureBlock} from '../interfaces/i_procedure_block.js'; -import {Workspace} from '../workspace.js'; - -goog.declareModuleId('Blockly.procedures.updateProcedures'); - - -/** - * Calls the `doProcedureUpdate` method on all blocks which implement it. - * - * @internal - */ -export function triggerProceduresUpdate(workspace: Workspace) { - if (workspace.isClearing) return; - for (const block of workspace.getAllBlocks(false)) { - if (isProcedureBlock(block)) { - block.doProcedureUpdate(); - } - } -} diff --git a/core/workspace.ts b/core/workspace.ts index 0602fa834..4db632f96 100644 --- a/core/workspace.ts +++ b/core/workspace.ts @@ -33,7 +33,7 @@ import {VariableMap} from './variable_map.js'; import type {VariableModel} from './variable_model.js'; import type {WorkspaceComment} from './workspace_comment.js'; import {IProcedureMap} from './interfaces/i_procedure_map.js'; -import {ObservableProcedureMap} from './procedures.js'; +import {ObservableProcedureMap} from './observable_procedure_map.js'; /** @@ -112,7 +112,7 @@ export class Workspace implements IASTNodeLocation { private readonly blockDB = new Map(); private readonly typedBlocksDB = new Map(); private variableMap: VariableMap; - private procedureMap: IProcedureMap = new ObservableProcedureMap(this); + private procedureMap: IProcedureMap = new ObservableProcedureMap(); /** * Blocks in the flyout can refer to variables that don't exist in the main diff --git a/tests/mocha/procedure_map_test.js b/tests/mocha/procedure_map_test.js index b38564545..3117cb6a2 100644 --- a/tests/mocha/procedure_map_test.js +++ b/tests/mocha/procedure_map_test.js @@ -21,49 +21,34 @@ suite('Procedure Map', function() { sharedTestTeardown.call(this); }); - suite('triggering block updates', function() { - setup(function() { - Blockly.Blocks['procedure_mock'] = { - init: function() { }, - doProcedureUpdate: function() { }, - getProcedureModel: function() { }, - isProcedureDef: function() { }, - }; + suite('publishing', function() { + test('inserting a procedure tells it to start publishing', function() { + const procedureModel = new MockProcedureModel(); + const spy = sinon.spy(procedureModel, 'startPublishing'); + this.procedureMap.set(procedureModel.getId(), procedureModel); - this.procedureBlock = this.workspace.newBlock('procedure_mock'); - - this.updateSpy = sinon.spy(this.procedureBlock, 'doProcedureUpdate'); + chai.assert.isTrue( + spy.called, 'Expected the model to start publishing'); }); - teardown(function() { - delete Blockly.Blocks['procedure_mock']; + test('adding a procedure tells it to start publishing', function() { + const procedureModel = new MockProcedureModel(); + const spy = sinon.spy(procedureModel, 'startPublishing'); + this.procedureMap.add(procedureModel); + + chai.assert.isTrue( + spy.called, 'Expected the model to start publishing'); }); - suite('procedure map updates', function() { - test('inserting a procedure does not trigger an update', function() { - const procedureModel = new MockProcedureModel(); - this.procedureMap.set(procedureModel.getId(), procedureModel); + test('deleting a procedure tells it to stop publishing', function() { + const procedureModel = new MockProcedureModel(); + const spy = sinon.spy(procedureModel, 'stopPublishing'); + this.procedureMap.add(procedureModel); - chai.assert.isFalse( - this.updateSpy.called, 'Expected no update to be triggered'); - }); + this.procedureMap.delete(procedureModel.getId()); - test('adding a procedure does not trigger an update', function() { - this.procedureMap.add(new MockProcedureModel()); - - chai.assert.isFalse( - this.updateSpy.called, 'Expected no update to be triggered'); - }); - - test('deleting a procedure triggers an update', function() { - const procedureModel = new MockProcedureModel(); - this.procedureMap.add(procedureModel); - - this.procedureMap.delete(procedureModel.getId()); - - chai.assert.isTrue( - this.updateSpy.calledOnce, 'Expected an update to be triggered'); - }); + chai.assert.isTrue( + spy.calledOnce, 'Expected the model stop publishing'); }); }); }); diff --git a/tests/mocha/test_helpers/procedures.js b/tests/mocha/test_helpers/procedures.js index ec33e1aeb..78dd839f4 100644 --- a/tests/mocha/test_helpers/procedures.js +++ b/tests/mocha/test_helpers/procedures.js @@ -206,6 +206,10 @@ export class MockProcedureModel { getEnabled() { return this.enabled; } + + startPublishing() { } + + stopPublishing() { } } export class MockParameterModel {