8
0

utils.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /**
  2. * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. 'use strict';
  6. /* global console:false */
  7. import EmitterMixin from '/ckeditor5/utils/emittermixin.js';
  8. const utils = {
  9. /**
  10. * Creates an instance inheriting from {@link utils.EmitterMixin} with one additional method `observe()`.
  11. * It allows observing changes to attributes in objects being {@link utils.Observable observable}.
  12. *
  13. * The `observe()` method accepts:
  14. *
  15. * * `{String} observableName` – Identifier for the observable object. E.g. `"Editable"` when
  16. * you observe one of editor's editables. This name will be displayed on the console.
  17. * * `{utils.Observable observable} – The object to observe.
  18. *
  19. * Typical usage:
  20. *
  21. * const observer = utils.createObserver();
  22. * observer.observe( 'Editable', editor.editables.current );
  23. *
  24. * // Stop listening (method from the EmitterMixin):
  25. * observer.stopListening();
  26. *
  27. * @returns {Emitter} The observer.
  28. */
  29. createObserver() {
  30. const observer = Object.create( EmitterMixin, {
  31. observe: {
  32. value: function observe( observableName, observable ) {
  33. observer.listenTo( observable, 'change', ( evt, propertyName, value, oldValue ) => {
  34. console.log( `[Change in ${ observableName }] ${ propertyName } = '${ value }' (was '${ oldValue }')` );
  35. } );
  36. return observer;
  37. }
  38. }
  39. } );
  40. return observer;
  41. },
  42. /**
  43. * Checkes wether observable properties are properly bound to each other.
  44. *
  45. * Syntax given that observable `A` is bound to observables [`B`, `C`, ...]:
  46. *
  47. * assertBinding( A,
  48. * { initial `A` attributes },
  49. * [
  50. * [ B, { new `B` attributes } ],
  51. * [ C, { new `C` attributes } ],
  52. * ...
  53. * ],
  54. * { `A` attributes after [`B`, 'C', ...] changed }
  55. * );
  56. */
  57. assertBinding( observable, stateBefore, data, stateAfter ) {
  58. let key, pair;
  59. for ( key in stateBefore ) {
  60. expect( observable[ key ] ).to.be.equal( stateBefore[ key ] );
  61. }
  62. // Change attributes of bound observables.
  63. for ( pair of data ) {
  64. for ( key in pair[ 1 ] ) {
  65. pair[ 0 ][ key ] = pair[ 1 ][ key ];
  66. }
  67. }
  68. for ( key in stateAfter ) {
  69. expect( observable[ key ] ).to.be.equal( stateAfter[ key ] );
  70. }
  71. }
  72. };
  73. export default utils;