From 0c2da7f7348095ae6babeee230484f7f9c59ea62 Mon Sep 17 00:00:00 2001
From: Paco Guzman <pacoguzmanp@gmail.com>
Date: Mon, 18 Jul 2016 11:02:19 +0200
Subject: [PATCH] Don't parse Rinku returned value to DocFragment when it
 didn't change the original html string.

---
 CHANGELOG                                     |  1 +
 lib/banzai/filter/autolink_filter.rb          |  2 ++
 .../lib/banzai/filter/autolink_filter_spec.rb | 20 +++++++++++++++++++
 3 files changed, 23 insertions(+)

diff --git a/CHANGELOG b/CHANGELOG
index 94f212324f7..8c12c427597 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -64,6 +64,7 @@ v 8.10.0 (unreleased)
   - Collapse large diffs by default (!4990)
   - Fix mentioned users list on diff notes
   - Fix creation of deployment on build that is retried, redeployed or rollback
+  - Don't parse Rinku returned value to DocFragment when it didn't change the original html string.
   - Check for conflicts with existing Project's wiki path when creating a new project.
   - Show last push widget in upstream after push to fork
   - Fix stage status shown for pipelines
diff --git a/lib/banzai/filter/autolink_filter.rb b/lib/banzai/filter/autolink_filter.rb
index fac7dad3243..9ed45707515 100644
--- a/lib/banzai/filter/autolink_filter.rb
+++ b/lib/banzai/filter/autolink_filter.rb
@@ -56,6 +56,8 @@ module Banzai
         # period (e.g., http://localhost:3000/)
         rinku = Rinku.auto_link(html, :urls, options, IGNORE_PARENTS.to_a, 1)
 
+        return if rinku == html
+
         # Rinku returns a String, so parse it back to a Nokogiri::XML::Document
         # for further processing.
         @doc = parse_html(rinku)
diff --git a/spec/lib/banzai/filter/autolink_filter_spec.rb b/spec/lib/banzai/filter/autolink_filter_spec.rb
index 84c2ddf444e..dca7f997570 100644
--- a/spec/lib/banzai/filter/autolink_filter_spec.rb
+++ b/spec/lib/banzai/filter/autolink_filter_spec.rb
@@ -15,6 +15,16 @@ describe Banzai::Filter::AutolinkFilter, lib: true do
     expect(filter(act).to_html).to eq exp
   end
 
+  context 'when the input contains no links' do
+    it 'does not parse_html back the rinku returned value' do
+      act = HTML::Pipeline.parse('<p>This text contains no links to autolink</p>')
+
+      expect_any_instance_of(described_class).not_to receive(:parse_html)
+
+      filter(act).to_html
+    end
+  end
+
   context 'Rinku schemes' do
     it 'autolinks http' do
       doc = filter("See #{link}")
@@ -58,6 +68,16 @@ describe Banzai::Filter::AutolinkFilter, lib: true do
         expect(filter(act).to_html).to eq exp
       end
     end
+
+    context 'when the input contains link' do
+      it 'does parse_html back the rinku returned value' do
+        act = HTML::Pipeline.parse("<p>See #{link}</p>")
+
+        expect_any_instance_of(described_class).to receive(:parse_html).at_least(:once).and_call_original
+
+        filter(act).to_html
+      end
+    end
   end
 
   context 'other schemes' do
-- 
GitLab