diff --git a/core/modules/outside_in/css/outside_in.module.css b/core/modules/outside_in/css/outside_in.module.css
index 984b1c0..baa522d 100644
--- a/core/modules/outside_in/css/outside_in.module.css
+++ b/core/modules/outside_in/css/outside_in.module.css
@@ -80,3 +80,10 @@
   box-shadow: 2px 2px #ddd;
 }
 
+#main-canvas.js-outside-in-edit-mode a,
+#main-canvas.js-outside-in-edit-mode input{
+  pointer-events: none;
+ }
+#main-canvas.js-outside-in-edit-mode .contextual-links a {
+  pointer-events: inherit;
+}
diff --git a/core/modules/outside_in/js/outside_in.js b/core/modules/outside_in/js/outside_in.js
index 16ca8ea..7742947 100644
--- a/core/modules/outside_in/js/outside_in.js
+++ b/core/modules/outside_in/js/outside_in.js
@@ -11,6 +11,7 @@
   var toggleEditSelector = '[data-drupal-outsidein="toggle"]';
   var itemsToToggleSelector = '#main-canvas, #toolbar-bar, [data-drupal-outsidein="editable"] a, [data-drupal-outsidein="editable"] button';
   var contextualItemsSelector = '[data-contextual-id] a, [data-contextual-id] button';
+  var quickEditItemSelector = '[data-quickedit-entity-id]';
 
   /**
    * Reacts to contextual links being added.
@@ -70,6 +71,20 @@
   }
 
   /**
+   * Disable the QuickEdit module editor if open.
+   */
+  function disableQuickEdit() {
+    $('.quickedit-toolbar button.action-cancel').click();
+  }
+
+  /**
+   * Close/remove offcanvas.
+   */
+  function closeOffCanvas() {
+    $('.ui-dialog-offcanvas .ui-dialog-titlebar-close').trigger('click');
+  }
+
+  /**
    *  Helper to switch edit mode state.
    *
    * @param {bool} editMode
@@ -101,8 +116,18 @@
             if ($(e.target).parent().hasClass('contextual') || !localStorage.getItem('Drupal.contextualToolbar.isViewing')) {
               return;
             }
-
             $(e.currentTarget).find(blockConfigureSelector).trigger('click');
+            disableQuickEdit();
+          });
+        $(quickEditItemSelector)
+          .not(contextualItemsSelector)
+          .on('click.outsidein', function (e) {
+            // Do not trigger if target is quick edit link to avoid loop.
+            if ($(e.target).parent().hasClass('contextual') || $(e.target).parent().hasClass('quickedit')) {
+              return;
+            }
+            $(e.currentTarget).find('li.quickedit a').trigger('click');
+            closeOffCanvas();
           });
       }
     }
@@ -112,11 +137,12 @@
       if ($editables.length) {
         document.removeEventListener('click', preventClick, true);
         $editables.off('.outsidein');
+        $(quickEditItemSelector).off('.outsidein');
       }
 
       $editButton.text(Drupal.t('Edit'));
-      // Close/remove offcanvas.
-      $('.ui-dialog-offcanvas .ui-dialog-titlebar-close').trigger('click');
+      closeOffCanvas();
+      disableQuickEdit();
     }
     getItemsToToggle().toggleClass('js-outside-in-edit-mode', editMode);
     $('.edit-mode-inactive').toggleClass('visually-hidden', editMode);
diff --git a/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInBlockFormTest.php b/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInBlockFormTest.php
index 3dce2a7..f3b1f9e 100644
--- a/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInBlockFormTest.php
+++ b/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInBlockFormTest.php
@@ -36,69 +36,66 @@ protected function setUp() {
   /**
    * Tests updating the "Powered by Drupal" block in the Off-Canvas tray.
    */
-  public function testPoweredByBlock() {
-    $block_selector = '#block-powered';
+  public function testBlock() {
+    $blocks = [
+      [
+        'id' => 'block-powered',
+        'new_page_text' => 'Can you imagine anyone showing the label on this block?',
+        'link_selector' => '.content a',
+      ],
+      [
+        'id' => 'block-branding',
+        'new_page_text' => 'The site that will live a very short life.',
+        'link_selector' => 'a[rel="home"]',
+      ],
+    ];
     $page = $this->getSession()->getPage();
-
-    $this->drupalGet('user');
-    $this->toggleEditingMode();
-    $this->openBlockForm($block_selector);
-
-    // Fill out form, save the form.
-    $new_label = 'Can you imagine anyone showing the label on this block?';
-    $page->fillField('settings[label]', $new_label);
-    $page->checkField('settings[label_display]');
-
-    // @todo Uncomment the following lines after GastonJS problem solved.
-    // https://www.drupal.org/node/2789381
-    // $this->getTray()->pressButton('Save block');
-    // Make sure the changes are present.
-    // $web_assert = $this->assertSession();
-    // $web_assert->pageTextContains($new_label);
-
-    $this->openBlockForm($block_selector);
-
-    $this->toggleEditingMode();
-    // Canvas should close when editing module is closed.
-    $this->waitForOffCanvasToClose();
-
-    // Go into Edit mode again
-    $this->toggleEditingMode();
-    // Open block form by click "Drupal" link in content.
-    $this->openBlockForm("$block_selector .content a");
-  }
-
-  /**
-   * Tests updating the System Branding block in the Off-Canvas tray.
-   *
-   * Also tests updating the site name.
-   */
-  public function testBrandingBlock() {
-    $block_selector = '#block-branding';
-
-    $this->drupalGet('user');
-    $page = $this->getSession()->getPage();
-    $this->toggleEditingMode();
-
-    // Open branding block form by clicking div.
-    $this->openBlockForm($block_selector);
-
-    // Fill out form, save the form.
-    $new_site_name = 'The site that will live a very short life.';
-    $page->fillField('settings[site_information][site_name]', $new_site_name);
-
-    // @todo Uncomment the following lines after GastonJS problem solved.
-    // https://www.drupal.org/node/2789381
-    // $web_assert = $this->assertSession();
-    // $this->getTray()->pressButton('Save block');
-    // Make sure the changes are present.
-    //$web_assert->pageTextContains($new_site_name);
-
-    $this->openBlockForm($block_selector);
-
-    $this->toggleEditingMode();
-    // Canvas should close when editing module is closed.
-    $this->waitForOffCanvasToClose();
+    foreach ($blocks as $block) {
+      $block_selector = '#' . $block['id'];
+      $this->drupalGet('user');
+      $this->toggleEditingMode();
+      $this->openBlockForm($block_selector);
+
+      switch ($block['id']) {
+        case 'block-powered':
+          // Fill out form, save the form.
+          $new_label = $block['new_page_text'];
+          $page->fillField('settings[label]', $new_label);
+          $page->checkField('settings[label_display]');
+          break;
+
+        case 'block-branding':
+          // Fill out form, save the form.
+          $new_site_name = $block['new_page_text'];
+          $page->fillField('settings[site_information][site_name]', $new_site_name);
+          break;
+
+        default:
+          throw new \Exception("Unknown block: " . $block['id']);
+      }
+
+      // @todo Uncomment the following lines after GastonJS problem solved.
+      // https://www.drupal.org/node/2789381
+      // $this->getTray()->pressButton('Save block');
+      // Make sure the changes are present.
+      // $web_assert = $this->assertSession();
+      // $web_assert->pageTextContains($block['new_page_text']);
+      $this->openBlockForm($block_selector);
+
+      $this->toggleEditingMode();
+      // Canvas should close when editing module is closed.
+      $this->waitForOffCanvasToClose();
+
+      // Go into Edit mode again.
+      $this->toggleEditingMode();
+
+      $link_selector = "$block_selector {$block['link_selector']}";
+      // Open block form by clicking a link inside the block.
+      $this->openBlockForm($link_selector);
+
+      // Exit edit mode.
+      $this->toggleEditingMode();
+    }
   }
 
   /**
@@ -134,11 +131,22 @@ protected function assertOffCanvasBlockFormIsValid() {
    *   A css selector selects the block or an element within it.
    */
   protected function openBlockForm($block_selector) {
-    $page = $this->getSession()->getPage();
-    // Open block form by clicking div.
-    $page->find('css', $block_selector)->click();
+    $this->triggerClick($block_selector);
     $this->waitForOffCanvasToOpen();
     $this->assertOffCanvasBlockFormIsValid();
   }
 
+  /**
+   * Trigger click on an element via Javascript.
+   *
+   * @todo Remove when Javascript testing bug is fixed. https://www.drupal.org/node/2773791
+   *
+   * @param string $css_selector
+   *   The CSS selector for the element to click.
+   */
+  protected function triggerClick($css_selector) {
+    $this->waitForElement($css_selector, 100);
+    $this->getSession()->getDriver()->evaluateScript("jQuery('$css_selector:first').trigger('click')");
+  }
+
 }
diff --git a/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInJavascriptTestBase.php b/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInJavascriptTestBase.php
index bc9ff9a..4a33155 100644
--- a/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInJavascriptTestBase.php
+++ b/core/modules/outside_in/tests/src/FunctionalJavascript/OutsideInJavascriptTestBase.php
@@ -27,6 +27,8 @@ public function enableTheme($theme) {
    * Waits for Off-canvas tray to open.
    */
   protected function waitForOffCanvasToOpen() {
+    $web_assert = $this->assertSession();
+    $web_assert->assertWaitOnAjaxRequest();
     $this->waitForElement('#drupal-offcanvas');
   }
 
