       
       UIApplication.shared.isIdleTimerDisabled = model.isIdleTimerDisabled
       
-      if let url = model.openingURL, url != oldValue.openingURL {
-        UIApplication.shared.openURL(url)
+      if case .considering(let url) = model.urlAction {
+        let didOpen = UIApplication.shared.openURL(url)
+        var edit = model
+        edit.urlAction = .allowing(
+          Session.Model.URLActionResponse(url: url, success: didOpen)
+        )
+        output.on(.next(edit))
+        // Model may change in response to output. Reevaluate before sending further output.
+        if case .allowing(let x) = model.urlAction, x.url == url {
+          var edit = model
+          edit.urlAction = .idle
+          output.on(.next(edit))
+        }
       }
       
       if let new = model.sendingEvent {

    left.isExperiencingHealthAuthorizationRequest == right.isExperiencingHealthAuthorizationRequest &&
    left.isIgnoringUserEvents == right.isIgnoringUserEvents &&
    left.isIdleTimerDisabled == right.isIdleTimerDisabled &&
    left.openingURL == right.openingURL &&
    left.sendingEvent == right.sendingEvent &&
    left.sendingAction == right.sendingAction &&
    left.isNetworkActivityIndicatorVisible == right.isNetworkActivityIndicatorVisible &&

  }
}

extension Session.Model.URLActionResponse: Equatable {
  static func ==(left: Session.Model.URLActionResponse, right: Session.Model.URLActionResponse) -> Bool { return
    left.url == right.url &&
    left.success == right.success
  }
}

func completionHandler(
  type: EditOperation,
  edit: Edit<Session.Model.ShortcutItem>
