Merge branch 'stable-3.2' into stable-3.3

* stable-3.2:
  Fix long range comment selection on Firefox
  Add is:merge operator to search bar autocompletion
  Decorate the number line element of a blank side
  Update git submodules
  Change --gr-formatted-text-prose-max-width from 80ch to 120ch

Bug: Issue 14036
Change-Id: I1b5ba0b384348c3bf6354e4e3939fb021df328e9
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts b/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts
index ae4adf7..96cc959 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message_html.ts
@@ -48,7 +48,7 @@
       font-weight: var(--font-weight-bold);
     }
     .message {
-      --gr-formatted-text-prose-max-width: 80ch;
+      --gr-formatted-text-prose-max-width: 120ch;
     }
     .collapsed .message {
       max-width: none;
diff --git a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.ts b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.ts
index d785a2f..4143d33 100644
--- a/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.ts
+++ b/polygerrit-ui/app/elements/core/gr-search-bar/gr-search-bar.ts
@@ -78,6 +78,7 @@
   'is:assigned',
   'is:closed',
   'is:ignored',
+  'is:merge',
   'is:merged',
   'is:open',
   'is:owner',
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.ts b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.ts
index 0091a0b..5630ce0 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.ts
@@ -357,11 +357,13 @@
   _getShadowOrDocumentSelection() {
     // When using native shadow DOM, the selection returned by
     // document.getSelection() cannot reference the actual DOM elements making
-    // up the diff, because they are in the shadow DOM of the gr-diff element.
-    // This takes the shadow DOM selection if one exists.
+    // up the diff in Safari because they are in the shadow DOM of the gr-diff
+    // element. This takes the shadow DOM selection if one exists.
     return this.root instanceof ShadowRoot && this.root.getSelection
       ? this.root.getSelection()
-      : shadow.getRange(this.root);
+      : this._isSafari()
+      ? shadow.getRange(this.root)
+      : document.getSelection();
   }
 
   _observeNodes() {
@@ -1072,6 +1074,13 @@
       }
     }, 0);
   }
+
+  _isSafari() {
+    return (
+      /^((?!chrome|android).)*safari/i.test(navigator.userAgent) ||
+      (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream)
+    );
+  }
 }
 
 declare global {