Compare commits

..

6 Commits

Author SHA1 Message Date
Zeno Rocha
53a733fcb5 Release v1.5.10 2016-04-03 22:33:02 -07:00
Zeno Rocha
7a5a910bcd Removes error message when target/text attributes are null, undefined, or false 2016-04-03 22:16:22 -07:00
Zeno Rocha
0163f7cb72 Merge pull request #216 from sebastianekstrom/master
Use const instead of let when applicable
2016-04-01 08:48:49 -07:00
Sebastian Ekström
941bdbb16e Use const instead of let when applicable 2016-04-01 13:17:12 +02:00
Zeno Rocha
00d5cc4e96 Updates tagline #210 2016-03-17 09:12:23 -07:00
Zeno Rocha
07a1f8456b Throws error when disabled or readonly attributes are used on target element
Fixes #41
2016-03-01 15:38:25 -08:00
9 changed files with 29 additions and 46 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "clipboard", "name": "clipboard",
"version": "1.5.9", "version": "1.5.10",
"description": "Modern copy to clipboard. No Flash. Just 2kb", "description": "Modern copy to clipboard. No Flash. Just 2kb",
"license": "MIT", "license": "MIT",
"main": "dist/clipboard.js", "main": "dist/clipboard.js",

16
dist/clipboard.js vendored
View File

@@ -1,5 +1,5 @@
/*! /*!
* clipboard.js v1.5.9 * clipboard.js v1.5.10
* https://zenorocha.github.io/clipboard.js * https://zenorocha.github.io/clipboard.js
* *
* Licensed MIT © Zeno Rocha * Licensed MIT © Zeno Rocha
@@ -434,14 +434,10 @@ module.exports = E;
}; };
ClipboardAction.prototype.initSelection = function initSelection() { ClipboardAction.prototype.initSelection = function initSelection() {
if (this.text && this.target) { if (this.text) {
throw new Error('Multiple attributes declared, use either "target" or "text"');
} else if (this.text) {
this.selectFake(); this.selectFake();
} else if (this.target) { } else if (this.target) {
this.selectTarget(); this.selectTarget();
} else {
throw new Error('Missing required attributes, use either "target" or "text"');
} }
}; };
@@ -554,6 +550,14 @@ module.exports = E;
set: function set(target) { set: function set(target) {
if (target !== undefined) { if (target !== undefined) {
if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) { if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) {
if (this.action === 'copy' && target.hasAttribute('disabled')) {
throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
}
if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {
throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');
}
this._target = target; this._target = target;
} else { } else {
throw new Error('Invalid "target" value, use a valid Element'); throw new Error('Invalid "target" value, use a valid Element');

File diff suppressed because one or more lines are too long

View File

@@ -3,7 +3,7 @@
Package.describe({ Package.describe({
name: "zenorocha:clipboard", name: "zenorocha:clipboard",
summary: "Modern copy to clipboard. No Flash. Just 2kb.", summary: "Modern copy to clipboard. No Flash. Just 2kb.",
version: "1.5.9", version: "1.5.10",
git: "https://github.com/zenorocha/clipboard.js" git: "https://github.com/zenorocha/clipboard.js"
}); });

View File

@@ -1,6 +1,6 @@
{ {
"name": "clipboard", "name": "clipboard",
"version": "1.5.9", "version": "1.5.10",
"description": "Modern copy to clipboard. No Flash. Just 2kb", "description": "Modern copy to clipboard. No Flash. Just 2kb",
"repository": "zenorocha/clipboard.js", "repository": "zenorocha/clipboard.js",
"license": "MIT", "license": "MIT",

View File

@@ -3,7 +3,7 @@
[![Build Status](http://img.shields.io/travis/zenorocha/clipboard.js/master.svg?style=flat)](https://travis-ci.org/zenorocha/clipboard.js) [![Build Status](http://img.shields.io/travis/zenorocha/clipboard.js/master.svg?style=flat)](https://travis-ci.org/zenorocha/clipboard.js)
![Killing Flash](https://img.shields.io/badge/killing-flash-brightgreen.svg?style=flat) ![Killing Flash](https://img.shields.io/badge/killing-flash-brightgreen.svg?style=flat)
> Modern copy to clipboard. No Flash. Just 2kb > Modern copy to clipboard. No Flash. Just 3kb gzipped.
<a href="http://clipboardjs.com/"><img width="728" src="https://cloud.githubusercontent.com/assets/398893/9983535/5ab0a950-5fb4-11e5-9602-e73c0b661883.jpg" alt="Demo"></a> <a href="http://clipboardjs.com/"><img width="728" src="https://cloud.githubusercontent.com/assets/398893/9983535/5ab0a950-5fb4-11e5-9602-e73c0b661883.jpg" alt="Demo"></a>

View File

@@ -32,18 +32,12 @@ class ClipboardAction {
* on the existence of `text` and `target` properties. * on the existence of `text` and `target` properties.
*/ */
initSelection() { initSelection() {
if (this.text && this.target) { if (this.text) {
throw new Error('Multiple attributes declared, use either "target" or "text"');
}
else if (this.text) {
this.selectFake(); this.selectFake();
} }
else if (this.target) { else if (this.target) {
this.selectTarget(); this.selectTarget();
} }
else {
throw new Error('Missing required attributes, use either "target" or "text"');
}
} }
/** /**
@@ -51,7 +45,7 @@ class ClipboardAction {
* and makes a selection on it. * and makes a selection on it.
*/ */
selectFake() { selectFake() {
let isRTL = document.documentElement.getAttribute('dir') == 'rtl'; const isRTL = document.documentElement.getAttribute('dir') == 'rtl';
this.removeFake(); this.removeFake();
@@ -179,6 +173,14 @@ class ClipboardAction {
set target(target) { set target(target) {
if (target !== undefined) { if (target !== undefined) {
if (target && typeof target === 'object' && target.nodeType === 1) { if (target && typeof target === 'object' && target.nodeType === 1) {
if (this.action === 'copy' && target.hasAttribute('disabled')) {
throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
}
if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {
throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');
}
this._target = target; this._target = target;
} }
else { else {

View File

@@ -42,7 +42,7 @@ class Clipboard extends Emitter {
* @param {Event} e * @param {Event} e
*/ */
onClick(e) { onClick(e) {
let trigger = e.delegateTarget || e.currentTarget; const trigger = e.delegateTarget || e.currentTarget;
if (this.clipboardAction) { if (this.clipboardAction) {
this.clipboardAction = null; this.clipboardAction = null;
@@ -70,7 +70,7 @@ class Clipboard extends Emitter {
* @param {Element} trigger * @param {Element} trigger
*/ */
defaultTarget(trigger) { defaultTarget(trigger) {
let selector = getAttributeValue('target', trigger); const selector = getAttributeValue('target', trigger);
if (selector) { if (selector) {
return document.querySelector(selector); return document.querySelector(selector);
@@ -105,7 +105,7 @@ class Clipboard extends Emitter {
* @param {Element} element * @param {Element} element
*/ */
function getAttributeValue(suffix, element) { function getAttributeValue(suffix, element) {
let attribute = `data-clipboard-${suffix}`; const attribute = `data-clipboard-${suffix}`;
if (!element.hasAttribute(attribute)) { if (!element.hasAttribute(attribute)) {
return; return;

View File

@@ -35,29 +35,6 @@ describe('ClipboardAction', () => {
}); });
describe('#initSelection', () => { describe('#initSelection', () => {
it('should throw an error since both "text" and "target" were passed', done => {
try {
new ClipboardAction({
text: 'foo',
target: document.querySelector('#input')
});
}
catch(e) {
assert.equal(e.message, 'Multiple attributes declared, use either "target" or "text"');
done();
}
});
it('should throw an error since neither "text" nor "target" were passed', done => {
try {
new ClipboardAction();
}
catch(e) {
assert.equal(e.message, 'Missing required attributes, use either "target" or "text"');
done();
}
});
it('should set the position right style property', done => { it('should set the position right style property', done => {
// Set document direction // Set document direction
document.documentElement.setAttribute('dir', 'rtl'); document.documentElement.setAttribute('dir', 'rtl');