From 94ef2050cf20744dee884b98ecd9484a457752ce Mon Sep 17 00:00:00 2001
From: "Luke \"Jared\" Bennett" <lbennett@gitlab.com>
Date: Thu, 18 May 2017 16:45:27 +0100
Subject: [PATCH 1/3] Use anchor tag instead of button for clipboard with
 tooltip

---
 app/helpers/button_helper.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/helpers/button_helper.rb b/app/helpers/button_helper.rb
index 206d0753f08..a4a5fcf23ec 100644
--- a/app/helpers/button_helper.rb
+++ b/app/helpers/button_helper.rb
@@ -37,7 +37,7 @@ module ButtonHelper
 
     data = { toggle: 'tooltip', placement: 'bottom', container: 'body' }.merge(data)
 
-    content_tag :button,
+    content_tag :a,
       icon('clipboard', 'aria-hidden': 'true'),
       class: "btn #{css_class}",
       data: data,
-- 
GitLab


From be411be7980003430973051caa7a63d3da1884ea Mon Sep 17 00:00:00 2001
From: "Luke \"Jared\" Bennett" <lbennett@gitlab.com>
Date: Thu, 18 May 2017 17:47:09 +0100
Subject: [PATCH 2/3] Correct fix by reverting to anchor and bluring the
 disabled button on click

---
 app/assets/javascripts/blob/viewer/index.js | 4 ++--
 app/helpers/button_helper.rb                | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/app/assets/javascripts/blob/viewer/index.js b/app/assets/javascripts/blob/viewer/index.js
index 54b85e47358..d7c62889dde 100644
--- a/app/assets/javascripts/blob/viewer/index.js
+++ b/app/assets/javascripts/blob/viewer/index.js
@@ -50,9 +50,9 @@ export default class BlobViewer {
 
     if (this.copySourceBtn) {
       this.copySourceBtn.addEventListener('click', () => {
-        if (this.copySourceBtn.classList.contains('disabled')) return;
+        if (this.copySourceBtn.classList.contains('disabled')) return this.copySourceBtn.blur();
 
-        this.switchToViewer('simple');
+        return this.switchToViewer('simple');
       });
     }
   }
diff --git a/app/helpers/button_helper.rb b/app/helpers/button_helper.rb
index a4a5fcf23ec..206d0753f08 100644
--- a/app/helpers/button_helper.rb
+++ b/app/helpers/button_helper.rb
@@ -37,7 +37,7 @@ module ButtonHelper
 
     data = { toggle: 'tooltip', placement: 'bottom', container: 'body' }.merge(data)
 
-    content_tag :a,
+    content_tag :button,
       icon('clipboard', 'aria-hidden': 'true'),
       class: "btn #{css_class}",
       data: data,
-- 
GitLab


From 255aed3a317c4c70ec74e1471eb50721435efa24 Mon Sep 17 00:00:00 2001
From: "Luke \"Jared\" Bennett" <lbennett@gitlab.com>
Date: Thu, 18 May 2017 18:07:08 +0100
Subject: [PATCH 3/3] Added spec for bluring disabled copy button

---
 spec/javascripts/blob/viewer/index_spec.js | 31 +++++++++++++++++++---
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/spec/javascripts/blob/viewer/index_spec.js b/spec/javascripts/blob/viewer/index_spec.js
index 13f122b68b2..af04e7c1e72 100644
--- a/spec/javascripts/blob/viewer/index_spec.js
+++ b/spec/javascripts/blob/viewer/index_spec.js
@@ -83,25 +83,48 @@ describe('Blob viewer', () => {
   });
 
   describe('copy blob button', () => {
+    let copyButton;
+
+    beforeEach(() => {
+      copyButton = document.querySelector('.js-copy-blob-source-btn');
+    });
+
     it('disabled on load', () => {
       expect(
-        document.querySelector('.js-copy-blob-source-btn').classList.contains('disabled'),
+        copyButton.classList.contains('disabled'),
       ).toBeTruthy();
     });
 
     it('has tooltip when disabled', () => {
       expect(
-        document.querySelector('.js-copy-blob-source-btn').getAttribute('data-original-title'),
+        copyButton.getAttribute('data-original-title'),
       ).toBe('Switch to the source to copy it to the clipboard');
     });
 
+    it('is blurred when clicked and disabled', () => {
+      spyOn(copyButton, 'blur');
+
+      copyButton.click();
+
+      expect(copyButton.blur).toHaveBeenCalled();
+    });
+
+    it('is not blurred when clicked and not disabled', () => {
+      spyOn(copyButton, 'blur');
+
+      copyButton.classList.remove('disabled');
+      copyButton.click();
+
+      expect(copyButton.blur).not.toHaveBeenCalled();
+    });
+
     it('enables after switching to simple view', (done) => {
       document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]').click();
 
       setTimeout(() => {
         expect($.ajax).toHaveBeenCalled();
         expect(
-          document.querySelector('.js-copy-blob-source-btn').classList.contains('disabled'),
+          copyButton.classList.contains('disabled'),
         ).toBeFalsy();
 
         done();
@@ -115,7 +138,7 @@ describe('Blob viewer', () => {
         expect($.ajax).toHaveBeenCalled();
 
         expect(
-          document.querySelector('.js-copy-blob-source-btn').getAttribute('data-original-title'),
+          copyButton.getAttribute('data-original-title'),
         ).toBe('Copy source to clipboard');
 
         done();
-- 
GitLab