| <!DOCTYPE html> |
| <!-- |
| Copyright (C) 2016 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes"> |
| <title>gr-diff-selection</title> |
| |
| <script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script> |
| <script src="../../../bower_components/web-component-tester/browser.js"></script> |
| |
| <link rel="import" href="../../../bower_components/iron-test-helpers/iron-test-helpers.html"> |
| <link rel="import" href="gr-diff-selection.html"> |
| |
| <test-fixture id="basic"> |
| <template> |
| <gr-diff-selection> |
| <table> |
| <tr> |
| <td class="lineNum left">1</td> |
| <td class="content">ba ba</td> |
| <td class="lineNum right">1</td> |
| <td class="content">some other text</td> |
| </tr> |
| <tr> |
| <td class="lineNum left">2</td> |
| <td class="content">zin</td> |
| <td class="lineNum right">2</td> |
| <td class="content">more more more</td> |
| </tr> |
| <tr> |
| <td class="lineNum left">2</td> |
| <td class="content">ga ga</td> |
| <td class="lineNum right">3</td> |
| <td class="other">some other text</td> |
| </tr> |
| </table> |
| </gr-diff-selection> |
| </template> |
| </test-fixture> |
| |
| <script> |
| suite('gr-diff-selection', function() { |
| var element; |
| |
| var emulateCopyOn = function(target) { |
| var fakeEvent = { |
| target: target, |
| preventDefault: sinon.stub(), |
| clipboardData: { |
| setData: sinon.stub(), |
| }, |
| }; |
| element._handleCopy(fakeEvent); |
| return fakeEvent; |
| }; |
| |
| setup(function() { |
| element = fixture('basic'); |
| element._cachedDiffBuilder = { |
| getLineElByChild: sinon.stub().returns({}), |
| getSideByLineEl: sinon.stub(), |
| }; |
| }); |
| |
| test('applies selected-left on left side click', function() { |
| element.classList.add('selected-right'); |
| element._cachedDiffBuilder.getSideByLineEl.returns('left'); |
| MockInteractions.down(element); |
| assert.isTrue( |
| element.classList.contains('selected-left'), 'adds selected-left'); |
| assert.isFalse( |
| element.classList.contains('selected-right'), |
| 'removes selected-right'); |
| }); |
| |
| test('applies selected-right on right side click', function() { |
| element.classList.add('selected-left'); |
| element._cachedDiffBuilder.getSideByLineEl.returns('right'); |
| MockInteractions.down(element); |
| assert.isTrue( |
| element.classList.contains('selected-right'), 'adds selected-right'); |
| assert.isFalse( |
| element.classList.contains('selected-left'), 'removes selected-left'); |
| }); |
| |
| test('ignores copy for non-content Element', function() { |
| sinon.stub(element, '_getSelectedText'); |
| emulateCopyOn(element.querySelector('.other')); |
| assert.isFalse(element._getSelectedText.called); |
| }); |
| |
| test('asks for text for right side Elements', function() { |
| element._cachedDiffBuilder.getSideByLineEl.returns('left'); |
| sinon.stub(element, '_getSelectedText'); |
| emulateCopyOn(element.querySelector('td.content')); |
| assert.deepEqual(['left'], element._getSelectedText.lastCall.args); |
| }); |
| |
| test('reacts to copy for content Elements', function() { |
| sinon.stub(element, '_getSelectedText'); |
| emulateCopyOn(element.querySelector('td.content')); |
| assert.isTrue(element._getSelectedText.called); |
| }); |
| |
| test('copy event is prevented for content Elements', function() { |
| sinon.stub(element, '_getSelectedText'); |
| var event = emulateCopyOn(element.querySelector('td.content')); |
| assert.isTrue(event.preventDefault.called); |
| }); |
| |
| test('inserts text into clipboard on copy', function() { |
| sinon.stub(element, '_getSelectedText').returns('the text'); |
| var event = emulateCopyOn(element.querySelector('td.content')); |
| assert.deepEqual( |
| ['Text', 'the text'], event.clipboardData.setData.lastCall.args); |
| }); |
| |
| test('copies content correctly', function() { |
| element.classList.add('selected-left'); |
| var selection = window.getSelection(); |
| var range = document.createRange(); |
| range.setStart(element.querySelector('td.content').firstChild, 3); |
| range.setEnd( |
| element.querySelectorAll('td.content')[4].firstChild, 2); |
| selection.addRange(range); |
| assert.equal('ba\nzin\nga\n', element._getSelectedText('left')); |
| }); |
| }); |
| </script> |