Merge branch 'develop' into goog.module-prep

This resolves a conflict in `blockly_uncompressed.js`, and missing
updates to `test/deps.js`, caused by PR #5041.
This commit is contained in:
Christopher Allen
2021-07-13 22:16:35 +01:00
60 changed files with 12865 additions and 691 deletions

View File

@@ -742,25 +742,33 @@ Blockly.Block.prototype.getChildren = function(ordered) {
* @package
*/
Blockly.Block.prototype.setParent = function(newParent) {
if (newParent == this.parentBlock_) {
if (newParent === this.parentBlock_) {
return;
}
// Check that block is connected to new parent if new parent is not null and
// that block is not connected to superior one if new parent is null.
var connection = this.previousConnection || this.outputConnection;
var isConnected = !!(connection && connection.targetBlock());
if (isConnected && newParent && connection.targetBlock() !== newParent) {
throw Error('Block connected to superior one that is not new parent.');
} else if (!isConnected && newParent) {
throw Error('Block not connected to new parent.');
} else if (isConnected && !newParent) {
throw Error('Cannot set parent to null while block is still connected to' +
' superior block.');
}
if (this.parentBlock_) {
// Remove this block from the old parent's child list.
Blockly.utils.arrayRemove(this.parentBlock_.childBlocks_, this);
// Disconnect from superior blocks.
if (this.previousConnection && this.previousConnection.isConnected()) {
throw Error('Still connected to previous block.');
}
if (this.outputConnection && this.outputConnection.isConnected()) {
throw Error('Still connected to parent block.');
}
this.parentBlock_ = null;
// This block hasn't actually moved on-screen, so there's no need to update
// its connection locations.
// its connection locations.
} else {
// Remove this block from the workspace's list of top-most blocks.
// New parent must be non-null so remove this block from the workspace's
// list of top-most blocks.
this.workspace.removeTopBlock(this);
}

View File

@@ -159,7 +159,7 @@ Blockly.BlockDragSurfaceSvg.prototype.translateSurfaceInternal_ = function() {
this.SVG_.style.display = 'block';
Blockly.utils.dom.setCssTransform(
this.SVG_, 'translate3d(' + x + 'px, ' + y + 'px, 0px)');
this.SVG_, 'translate3d(' + x + 'px, ' + y + 'px, 0)');
};
/**

View File

@@ -55,6 +55,7 @@ goog.requireType('Blockly.WorkspaceSvg');
* the individual field's documentation for a list of properties this
* parameter supports.
* @constructor
* @abstract
* @implements {Blockly.IASTNodeLocationSvg}
* @implements {Blockly.IASTNodeLocationWithBlock}
* @implements {Blockly.IKeyboardAccessible}
@@ -276,7 +277,7 @@ Blockly.Field.prototype.configure_ = function(config) {
*/
Blockly.Field.prototype.setSourceBlock = function(block) {
if (this.sourceBlock_) {
throw Error('Field already bound to a block.');
throw Error('Field already bound to a block');
}
this.sourceBlock_ = block;
};

View File

@@ -135,7 +135,9 @@ Blockly.FieldAngle.prototype.DEFAULT_VALUE = 0;
* @nocollapse
*/
Blockly.FieldAngle.fromJson = function(options) {
return new Blockly.FieldAngle(options['angle'], undefined, options);
// `this` might be a subclass of FieldAngle if that class doesn't override
// the static fromJson method.
return new this(options['angle'], undefined, options);
};
/**

View File

@@ -63,7 +63,9 @@ Blockly.FieldCheckbox.prototype.DEFAULT_VALUE = false;
* @nocollapse
*/
Blockly.FieldCheckbox.fromJson = function(options) {
return new Blockly.FieldCheckbox(options['checked'], undefined, options);
// `this` might be a subclass of FieldCheckbox if that class doesn't override
// the static fromJson method.
return new this(options['checked'], undefined, options);
};
/**

View File

@@ -104,7 +104,9 @@ Blockly.utils.object.inherits(Blockly.FieldColour, Blockly.Field);
* @nocollapse
*/
Blockly.FieldColour.fromJson = function(options) {
return new Blockly.FieldColour(options['colour'], undefined, options);
// `this` might be a subclass of FieldColour if that class doesn't override
// the static fromJson method.
return new this(options['colour'], undefined, options);
};
/**

View File

@@ -149,7 +149,9 @@ Blockly.FieldDropdown.ImageProperties;
* @nocollapse
*/
Blockly.FieldDropdown.fromJson = function(options) {
return new Blockly.FieldDropdown(options['options'], undefined, options);
// `this` might be a subclass of FieldDropdown if that class doesn't override
// the static fromJson method.
return new this(options['options'], undefined, options);
};
/**

View File

@@ -132,8 +132,9 @@ Blockly.FieldImage.prototype.DEFAULT_VALUE = '';
* @nocollapse
*/
Blockly.FieldImage.fromJson = function(options) {
return new Blockly.FieldImage(
options['src'], options['width'], options['height'],
// `this` might be a subclass of FieldImage if that class doesn't override
// the static fromJson method.
return new this(options['src'], options['width'], options['height'],
undefined, undefined, undefined, options);
};

View File

@@ -65,7 +65,9 @@ Blockly.FieldLabel.prototype.DEFAULT_VALUE = '';
*/
Blockly.FieldLabel.fromJson = function(options) {
var text = Blockly.utils.replaceMessageReferences(options['text']);
return new Blockly.FieldLabel(text, undefined, options);
// `this` might be a subclass of FieldLabel if that class doesn't override
// the static fromJson method.
return new this(text, undefined, options);
};
/**

View File

@@ -48,7 +48,9 @@ Blockly.utils.object.inherits(Blockly.FieldLabelSerializable,
*/
Blockly.FieldLabelSerializable.fromJson = function(options) {
var text = Blockly.utils.replaceMessageReferences(options['text']);
return new Blockly.FieldLabelSerializable(text, undefined, options);
// `this` might be a subclass of FieldLabelSerializable if that class doesn't
// override the static fromJson method.
return new this(text, undefined, options);
};
/**

View File

@@ -89,7 +89,9 @@ Blockly.FieldMultilineInput.prototype.configure_ = function(config) {
*/
Blockly.FieldMultilineInput.fromJson = function(options) {
var text = Blockly.utils.replaceMessageReferences(options['text']);
return new Blockly.FieldMultilineInput(text, undefined, options);
// `this` might be a subclass of FieldMultilineInput if that class doesn't
// override the static fromJson method.
return new this(text, undefined, options);
};
/**

View File

@@ -91,7 +91,9 @@ Blockly.FieldNumber.prototype.DEFAULT_VALUE = 0;
* @nocollapse
*/
Blockly.FieldNumber.fromJson = function(options) {
return new Blockly.FieldNumber(options['value'],
// `this` might be a subclass of FieldNumber if that class doesn't override
// the static fromJson method.
return new this(options['value'],
undefined, undefined, undefined, undefined, options);
};

View File

@@ -110,7 +110,9 @@ Blockly.FieldTextInput.prototype.DEFAULT_VALUE = '';
*/
Blockly.FieldTextInput.fromJson = function(options) {
var text = Blockly.utils.replaceMessageReferences(options['text']);
return new Blockly.FieldTextInput(text, undefined, options);
// `this` might be a subclass of FieldTextInput if that class doesn't override
// the static fromJson method.
return new this(text, undefined, options);
};
/**
@@ -340,6 +342,7 @@ Blockly.FieldTextInput.prototype.showInlineEditor_ = function(quietInput) {
* @protected
*/
Blockly.FieldTextInput.prototype.widgetCreate_ = function() {
Blockly.Events.setGroup(true);
var div = Blockly.WidgetDiv.DIV;
Blockly.utils.dom.addClass(this.getClickTarget_(), 'editing');
@@ -368,8 +371,8 @@ Blockly.FieldTextInput.prototype.widgetCreate_ = function() {
div.style.borderRadius = borderRadius;
div.style.transition = 'box-shadow 0.25s ease 0s';
if (this.getConstants().FIELD_TEXTINPUT_BOX_SHADOW) {
div.style.boxShadow = 'rgba(255, 255, 255, 0.3) 0px 0px 0px ' +
4 * scale + 'px';
div.style.boxShadow = 'rgba(255, 255, 255, 0.3) 0 0 0 ' +
(4 * scale) + 'px';
}
}
htmlInput.style.borderRadius = borderRadius;
@@ -402,6 +405,7 @@ Blockly.FieldTextInput.prototype.widgetDispose_ = function() {
if (this.onFinishEditing_) {
this.onFinishEditing_(this.value_);
}
Blockly.Events.setGroup(false);
// Actual disposal.
this.unbindInputEvents_();
@@ -477,15 +481,10 @@ Blockly.FieldTextInput.prototype.onHtmlInputChange_ = function(_e) {
if (text !== this.htmlInput_.oldValue_) {
this.htmlInput_.oldValue_ = text;
// TODO(#2169): Once issue is fixed the setGroup functionality could be
// moved up to the Field setValue method. This would create a
// broader fix for all field types.
Blockly.Events.setGroup(true);
var value = this.getValueFromEditorText_(text);
this.setValue(value);
this.forceRerender();
this.resizeEditor_();
Blockly.Events.setGroup(false);
}
};

View File

@@ -100,8 +100,9 @@ Blockly.utils.object.inherits(Blockly.FieldVariable, Blockly.FieldDropdown);
*/
Blockly.FieldVariable.fromJson = function(options) {
var varName = Blockly.utils.replaceMessageReferences(options['variable']);
return new Blockly.FieldVariable(
varName, undefined, undefined, undefined, options);
// `this` might be a subclass of FieldVariable if that class doesn't override
// the static fromJson method.
return new this(varName, undefined, undefined, undefined, options);
};
/**

View File

@@ -343,6 +343,10 @@ Blockly.HorizontalFlyout.prototype.reflowInternal_ = function() {
for (var i = 0, block; (block = blocks[i]); i++) {
flyoutHeight = Math.max(flyoutHeight, block.getHeightWidth().height);
}
var buttons = this.buttons_;
for (var i = 0, button; (button = buttons[i]); i++) {
flyoutHeight = Math.max(flyoutHeight, button.height);
}
flyoutHeight += this.MARGIN * 1.5;
flyoutHeight *= this.workspace_.scale;
flyoutHeight += Blockly.Scrollbar.scrollbarThickness;

View File

@@ -82,8 +82,3 @@ goog.require('Blockly.zelos.Renderer');
// Blockly Themes.
// Classic is the default theme.
goog.require('Blockly.Themes.Classic');
goog.require('Blockly.Themes.Dark');
goog.require('Blockly.Themes.Deuteranopia');
goog.require('Blockly.Themes.HighContrast');
goog.require('Blockly.Themes.Tritanopia');
// goog.require('Blockly.Themes.Modern');

View File

@@ -1,33 +0,0 @@
/**
* @license
* Copyright 2019 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @fileoverview Dark theme.
* @author samelh@google.com (Sam El-Husseini)
*/
'use strict';
goog.provide('Blockly.Themes.Dark');
goog.require('Blockly.Theme');
Blockly.Themes.Dark = Blockly.Theme.defineTheme('dark', {
'base': Blockly.Themes.Classic,
'componentStyles': {
'workspaceBackgroundColour': '#1e1e1e',
'toolboxBackgroundColour': 'blackBackground',
'toolboxForegroundColour': '#fff',
'flyoutBackgroundColour': '#252526',
'flyoutForegroundColour': '#ccc',
'flyoutOpacity': 1,
'scrollbarColour': '#797979',
'insertionMarkerColour': '#fff',
'insertionMarkerOpacity': 0.3,
'scrollbarOpacity': 0.4,
'cursorColour': '#d0d0d0',
'blackBackground': '#333'
}
});

View File

@@ -1,104 +0,0 @@
/**
* @license
* Copyright 2019 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @fileoverview Deuteranopia theme.
* A colour palette for people that have deuteranopia (the inability to perceive
* green light). This can also be used for people that have protanopia (the
* inability to perceive red light).
*/
'use strict';
goog.provide('Blockly.Themes.Deuteranopia');
goog.require('Blockly.Theme');
// Temporary holding object.
Blockly.Themes.Deuteranopia = {};
Blockly.Themes.Deuteranopia.defaultBlockStyles = {
"colour_blocks": {
"colourPrimary": "#f2a72c",
"colourSecondary": "#f1c172",
"colourTertiary": "#da921c"
},
"list_blocks": {
"colourPrimary": "#7d65ab",
"colourSecondary": "#a88be0",
"colourTertiary": "#66518e"
},
"logic_blocks": {
"colourPrimary": "#9fd2f1",
"colourSecondary": "#c0e0f4",
"colourTertiary": "#74bae5"
},
"loop_blocks": {
"colourPrimary": "#795a07",
"colourSecondary": "#ac8726",
"colourTertiary": "#c4a03f"
},
"math_blocks": {
"colourPrimary": "#e6da39",
"colourSecondary": "#f3ec8e",
"colourTertiary": "#f2eeb7"
},
"procedure_blocks": {
"colourPrimary": "#590721",
"colourSecondary": "#8c475d",
"colourTertiary": "#885464"
},
"text_blocks": {
"colourPrimary": "#058863",
"colourSecondary": "#5ecfaf",
"colourTertiary": "#04684c"
},
"variable_blocks": {
"colourPrimary": "#47025a",
"colourSecondary": "#820fa1",
"colourTertiary": "#8e579d"
},
"variable_dynamic_blocks": {
"colourPrimary": "#47025a",
"colourSecondary": "#820fa1",
"colourTertiary": "#8e579d"
}
};
Blockly.Themes.Deuteranopia.categoryStyles = {
"colour_category": {
"colour": "#f2a72c"
},
"list_category": {
"colour": "#7d65ab"
},
"logic_category": {
"colour": "#9fd2f1"
},
"loop_category": {
"colour": "#795a07"
},
"math_category": {
"colour": "#e6da39"
},
"procedure_category": {
"colour": "#590721"
},
"text_category": {
"colour": "#058863"
},
"variable_category": {
"colour": "#47025a"
},
"variable_dynamic_category": {
"colour": "#47025a"
}
};
Blockly.Themes.Deuteranopia =
new Blockly.Theme('deuteranopia',
Blockly.Themes.Deuteranopia.defaultBlockStyles,
Blockly.Themes.Deuteranopia.categoryStyles);

View File

@@ -1,119 +0,0 @@
/**
* @license
* Copyright 2018 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @fileoverview High contrast theme.
* Darker colours to contrast the white font.
*/
'use strict';
goog.provide('Blockly.Themes.HighContrast');
goog.require('Blockly.Theme');
// Temporary holding object.
Blockly.Themes.HighContrast = {};
Blockly.Themes.HighContrast.defaultBlockStyles = {
"colour_blocks": {
"colourPrimary": "#a52714",
"colourSecondary": "#FB9B8C",
"colourTertiary": "#FBE1DD"
},
"list_blocks": {
"colourPrimary": "#4a148c",
"colourSecondary": "#AD7BE9",
"colourTertiary": "#CDB6E9"
},
"logic_blocks": {
"colourPrimary": "#01579b",
"colourSecondary": "#64C7FF",
"colourTertiary": "#C5EAFF"
},
"loop_blocks": {
"colourPrimary": "#33691e",
"colourSecondary": "#9AFF78",
"colourTertiary": "#E1FFD7"
},
"math_blocks": {
"colourPrimary": "#1a237e",
"colourSecondary": "#8A9EFF",
"colourTertiary": "#DCE2FF"
},
"procedure_blocks": {
"colourPrimary": "#006064",
"colourSecondary": "#77E6EE",
"colourTertiary": "#CFECEE"
},
"text_blocks": {
"colourPrimary": "#004d40",
"colourSecondary": "#5ae27c",
"colourTertiary": "#D2FFDD"
},
"variable_blocks": {
"colourPrimary": "#880e4f",
"colourSecondary": "#FF73BE",
"colourTertiary": "#FFD4EB"
},
"variable_dynamic_blocks": {
"colourPrimary": "#880e4f",
"colourSecondary": "#FF73BE",
"colourTertiary": "#FFD4EB"
},
"hat_blocks": {
"colourPrimary": "#880e4f",
"colourSecondary": "#FF73BE",
"colourTertiary": "#FFD4EB",
"hat": "cap"
}
};
Blockly.Themes.HighContrast.categoryStyles = {
"colour_category": {
"colour": "#a52714"
},
"list_category": {
"colour": "#4a148c"
},
"logic_category": {
"colour": "#01579b"
},
"loop_category": {
"colour": "#33691e"
},
"math_category": {
"colour": "#1a237e"
},
"procedure_category": {
"colour": "#006064"
},
"text_category": {
"colour": "#004d40"
},
"variable_category": {
"colour": "#880e4f"
},
"variable_dynamic_category": {
"colour": "#880e4f"
}
};
// This style is still being fleshed out and may change.
Blockly.Themes.HighContrast =
new Blockly.Theme('highcontrast',
Blockly.Themes.HighContrast.defaultBlockStyles,
Blockly.Themes.HighContrast.categoryStyles);
Blockly.Themes.HighContrast.setComponentStyle('selectedGlowColour', '#000000');
Blockly.Themes.HighContrast.setComponentStyle('selectedGlowSize', 1);
Blockly.Themes.HighContrast.setComponentStyle('replacementGlowColour', '#000000');
Blockly.Themes.HighContrast.setFontStyle({
'family': null, // Use default font-family.
'weight': null, // Use default font-weight.
'size': 16
});

View File

@@ -1,108 +0,0 @@
/**
* @license
* Copyright 2018 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @fileoverview Modern theme.
* Same colours as classic, but single coloured border.
*/
'use strict';
goog.provide('Blockly.Themes.Modern');
goog.require('Blockly.Theme');
// Temporary holding object.
Blockly.Themes.Modern = {};
Blockly.Themes.Modern.defaultBlockStyles = {
"colour_blocks": {
"colourPrimary": "#a5745b",
"colourSecondary": "#dbc7bd",
"colourTertiary": "#845d49"
},
"list_blocks": {
"colourPrimary": "#745ba5",
"colourSecondary": "#c7bddb",
"colourTertiary": "#5d4984"
},
"logic_blocks": {
"colourPrimary": "#5b80a5",
"colourSecondary": "#bdccdb",
"colourTertiary": "#496684"
},
"loop_blocks": {
"colourPrimary": "#5ba55b",
"colourSecondary": "#bddbbd",
"colourTertiary": "#498449"
},
"math_blocks": {
"colourPrimary": "#5b67a5",
"colourSecondary": "#bdc2db",
"colourTertiary": "#495284"
},
"procedure_blocks": {
"colourPrimary": "#995ba5",
"colourSecondary": "#d6bddb",
"colourTertiary": "#7a4984"
},
"text_blocks": {
"colourPrimary": "#5ba58c",
"colourSecondary": "#bddbd1",
"colourTertiary": "#498470"
},
"variable_blocks": {
"colourPrimary": "#a55b99",
"colourSecondary": "#dbbdd6",
"colourTertiary": "#84497a"
},
"variable_dynamic_blocks": {
"colourPrimary": "#a55b99",
"colourSecondary": "#dbbdd6",
"colourTertiary": "#84497a"
},
"hat_blocks": {
"colourPrimary": "#a55b99",
"colourSecondary": "#dbbdd6",
"colourTertiary": "#84497a",
"hat": "cap"
}
};
Blockly.Themes.Modern.categoryStyles = {
"colour_category": {
"colour": "#a5745b"
},
"list_category": {
"colour": "#745ba5"
},
"logic_category": {
"colour": "#5b80a5"
},
"loop_category": {
"colour": "#5ba55b"
},
"math_category": {
"colour": "#5b67a5"
},
"procedure_category": {
"colour": "#995ba5"
},
"text_category": {
"colour": "#5ba58c"
},
"variable_category": {
"colour": "#a55b99"
},
"variable_dynamic_category": {
"colour": "#a55b99"
}
};
// This style is still being fleshed out and may change.
Blockly.Themes.Modern =
new Blockly.Theme('modern', Blockly.Themes.Modern.defaultBlockStyles,
Blockly.Themes.Modern.categoryStyles);

View File

@@ -1,103 +0,0 @@
/**
* @license
* Copyright 2019 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @fileoverview Tritanopia theme.
* A colour palette for people that have tritanopia (the inability to perceive
* blue light).
*/
'use strict';
goog.provide('Blockly.Themes.Tritanopia');
goog.require('Blockly.Theme');
// Temporary holding object.
Blockly.Themes.Tritanopia = {};
Blockly.Themes.Tritanopia.defaultBlockStyles = {
"colour_blocks": {
"colourPrimary": "#05427f",
"colourSecondary": "#2974c0",
"colourTertiary": "#2d74bb"
},
"list_blocks": {
"colourPrimary": "#b69ce8",
"colourSecondary": "#ccbaef",
"colourTertiary": "#9176c5"
},
"logic_blocks": {
"colourPrimary": "#9fd2f1",
"colourSecondary": "#c0e0f4",
"colourTertiary": "#74bae5"
},
"loop_blocks": {
"colourPrimary": "#aa1846",
"colourSecondary": "#d36185",
"colourTertiary": "#7c1636"
},
"math_blocks": {
"colourPrimary": "#e6da39",
"colourSecondary": "#f3ec8e",
"colourTertiary": "#f2eeb7"
},
"procedure_blocks": {
"colourPrimary": "#590721",
"colourSecondary": "#8c475d",
"colourTertiary": "#885464"
},
"text_blocks": {
"colourPrimary": "#058863",
"colourSecondary": "#5ecfaf",
"colourTertiary": "#04684c"
},
"variable_blocks": {
"colourPrimary": "#4b2d84",
"colourSecondary": "#816ea7",
"colourTertiary": "#83759e"
},
"variable_dynamic_blocks": {
"colourPrimary": "#4b2d84",
"colourSecondary": "#816ea7",
"colourTertiary": "#83759e"
}
};
Blockly.Themes.Tritanopia.categoryStyles = {
"colour_category": {
"colour": "#05427f"
},
"list_category": {
"colour": "#b69ce8"
},
"logic_category": {
"colour": "#9fd2f1"
},
"loop_category": {
"colour": "#aa1846"
},
"math_category": {
"colour": "#e6da39"
},
"procedure_category": {
"colour": "#590721"
},
"text_category": {
"colour": "#058863"
},
"variable_category": {
"colour": "#4b2d84"
},
"variable_dynamic_category": {
"colour": "#4b2d84"
}
};
Blockly.Themes.Tritanopia =
new Blockly.Theme('tritanopia',
Blockly.Themes.Tritanopia.defaultBlockStyles,
Blockly.Themes.Tritanopia.categoryStyles);

View File

@@ -652,7 +652,7 @@ Blockly.Css.register([
'.blocklyToolboxDiv[dir="RTL"] .blocklyTreeRow {',
'margin-left: 8px;',
'padding-right: 0px',
'padding-right: 0',
'}',
'.blocklyTreeIcon {',

View File

@@ -370,7 +370,7 @@ Blockly.utils.dom.measureFontMetrics = function(text, fontSize, fontWeight,
var block = document.createElement('div');
block.style.width = '1px';
block.style.height = '0px';
block.style.height = 0;
var div = document.createElement('div');
div.setAttribute('style', 'position: fixed; top: 0; left: 0; display: flex;');

View File

@@ -19,15 +19,25 @@ goog.provide('Blockly.utils.object');
/**
* Inherit the prototype methods from one constructor into another.
*
* @param {!Function} childCtor Child class.
* @param {!Function} parentCtor Parent class.
* @suppress {strictMissingProperties} superClass_ is not defined on Function.
*/
Blockly.utils.object.inherits = function(childCtor, parentCtor) {
// Set a .superClass_ property so that methods can call parent methods
// without hard-coding the parent class name.
// Could be replaced by ES6's super().
childCtor.superClass_ = parentCtor.prototype;
// Link the child class to the parent class so that static methods inherit.
Object.setPrototypeOf(childCtor, parentCtor);
// Replace the child constructor's prototype object with an instance
// of the parent class.
childCtor.prototype = Object.create(parentCtor.prototype);
childCtor.prototype.constructor = childCtor;
// Alternatively, one could use this instead:
// Object.setPrototypeOf(childCtor.prototype, parentCtor.prototype);
};
/**

View File

@@ -94,7 +94,7 @@ Blockly.WorkspaceDragSurfaceSvg.prototype.translateSurface = function(x, y) {
this.SVG_.style.display = 'block';
Blockly.utils.dom.setCssTransform(
this.SVG_, 'translate3d(' + fixedX + 'px, ' + fixedY + 'px, 0px)');
this.SVG_, 'translate3d(' + fixedX + 'px, ' + fixedY + 'px, 0)');
};
/**