Move text selection out of gr-diff.

Change-Id: I0734653066a1bb78f95c141aa8202fad315b13c0
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
index cfe5d66..7c66bf1 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
@@ -17,8 +17,9 @@
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
 <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
-<link rel="import" href="../gr-diff-comment-thread/gr-diff-comment-thread.html">
 <link rel="import" href="../gr-diff-builder/gr-diff-builder.html">
+<link rel="import" href="../gr-diff-comment-thread/gr-diff-comment-thread.html">
+<link rel="import" href="../gr-diff-selection/gr-diff-selection.html">
 
 <dom-module id="gr-diff">
   <template>
@@ -41,7 +42,7 @@
         border-collapse: collapse;
         border-right: 1px solid #ddd;
       }
-      .section {
+      .lineNum {
         background-color: #eee;
       }
       .image-diff .gr-diff {
@@ -99,18 +100,6 @@
         max-width: var(--content-width, 80ch);
         min-width: var(--content-width, 80ch);
       }
-      .content.left {
-        -webkit-user-select: var(--left-user-select, text);
-        -moz-user-select: var(--left-user-select, text);
-        -ms-user-select: var(--left-user-select, text);
-        user-select: var(--left-user-select, text);
-      }
-      .content.right {
-        -webkit-user-select: var(--right-user-select, text);
-        -moz-user-select: var(--right-user-select, text);
-        -ms-user-select: var(--right-user-select, text);
-        user-select: var(--right-user-select, text);
-      }
       .content.add hl,
       .content.add.darkHighlight {
         background-color: var(--dark-add-highlight-color);
@@ -151,17 +140,17 @@
       }
     </style>
     <div class$="[[_computeContainerClass(_loggedIn, viewMode)]]"
-        on-tap="_handleTap"
-        on-mousedown="_handleMouseDown"
-        on-copy="_handleCopy">
-      <gr-diff-builder
-         id="diffBuilder"
-         view-mode="[[viewMode]]"
-         is-image-diff="[[isImageDiff]]"
-         base-image="[[_baseImage]]"
-         revision-image="[[_revisionImage]]">
-        <table id="diffTable"></table>
-      </gr-diff-builder>
+        on-tap="_handleTap">
+      <gr-diff-selection>
+        <gr-diff-builder
+            id="diffBuilder"
+            view-mode="[[viewMode]]"
+            is-image-diff="[[isImageDiff]]"
+            base-image="[[_baseImage]]"
+            revision-image="[[_revisionImage]]">
+          <table id="diffTable"></table>
+        </gr-diff-builder>
+      </gr-diff-selection>
     </div>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
index f89d1e8..f3a353b 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
@@ -54,10 +54,6 @@
         value: DiffViewMode.SIDE_BY_SIDE,
       },
       _diff: Object,
-      _selectionSide: {
-        type: String,
-        observer: '_selectionSideChanged',
-      },
       _comments: Object,
     },
 
@@ -297,66 +293,6 @@
       });
     },
 
-    _handleMouseDown: function(e) {
-      var el = Polymer.dom(e).rootTarget;
-      var side;
-      for (var node = el; node != null; node = node.parentNode) {
-        if (!node.classList) { continue; }
-
-        if (node.classList.contains(DiffSide.LEFT)) {
-          side = DiffSide.LEFT;
-          break;
-        } else if (node.classList.contains(DiffSide.RIGHT)) {
-          side = DiffSide.RIGHT;
-          break;
-        }
-      }
-      this._selectionSide = side;
-    },
-
-    _selectionSideChanged: function(side) {
-      if (side) {
-        var oppositeSide = side === DiffSide.RIGHT ?
-            DiffSide.LEFT : DiffSide.RIGHT;
-        this.customStyle['--' + side + '-user-select'] = 'text';
-        this.customStyle['--' + oppositeSide + '-user-select'] = 'none';
-      } else {
-        this.customStyle['--left-user-select'] = 'text';
-        this.customStyle['--right-user-select'] = 'text';
-      }
-      this.updateStyles();
-    },
-
-    _handleCopy: function(e) {
-      if (!e.target.classList.contains('content')) {
-        return;
-      }
-      var text = this._getSelectedText(this._selectionSide);
-      e.clipboardData.setData('Text', text);
-      e.preventDefault();
-    },
-
-    _getSelectedText: function(opt_side) {
-      var sel = window.getSelection();
-      var range = sel.getRangeAt(0);
-      var doc = range.cloneContents();
-      var selector = '.content';
-      if (opt_side) {
-        selector += '.' + opt_side;
-      }
-      var contentEls = Polymer.dom(doc).querySelectorAll(selector);
-
-      if (contentEls.length === 0) {
-        return doc.textContent;
-      }
-
-      var text = '';
-      for (var i = 0; i < contentEls.length; i++) {
-        text += contentEls[i].textContent + '\n';
-      }
-      return text;
-    },
-
     _prefsChanged: function(prefsChangeRecord) {
       var prefs = prefsChangeRecord.base;
       this.customStyle['--content-width'] = prefs.line_length + 'ch';
@@ -473,7 +409,6 @@
           this.changeNum, this._diff, this.patchRange);
     },
 
-
     _projectConfigChanged: function(projectConfig) {
       var threadEls = this._getCommentThreads();
       for (var i = 0; i < threadEls.length; i++) {