anchor.diff:      }
     }
   
  -  Future postRequest(String command, [params]) => _performRequest(
  +  Future postRequest(String command, [params]) => _performRequestWithLog(
         () => _commandProcessor.post(_resolve(command), params),
         'POST',
         command,
         params);
   
  -  Future getRequest(String command) => _performRequest(
  +  Future getRequest(String command) => _performRequestWithLog(
         () => _commandProcessor.get(_resolve(command)), 'GET', command, null);
   
  -  Future deleteRequest(String command) => _performRequest(
  +  Future deleteRequest(String command) => _performRequestWithLog(
         () => _commandProcessor.delete(_resolve(command)),
         'DELETE',
         command,
         null);
  +
  +  Future _performRequestWithLog(
  +      Function fn, String method, String command, params) async {
  +    return await _performRequest(fn, method, command, params)
  +        .whenComplete(() async {
  +      if (notifyListeners) {
  +        if (_previousEvent == null) {
  +          throw new Error(); // This should be impossible.
  +        }
  +        _onCommandController.add(_previousEvent);
  +        for (WebDriverListener listener in _commandListeners) {
  +          await listener(_previousEvent);
  +        }
  +      }
  +    });
  +  }
  +
  +  // This is an ugly hack, I know, but I dunno how to cleanly do this.
  +  var _previousEvent = null;
   
     Future _performRequest(
         Function fn, String method, String command, params) async {
  
positive.code:       return new Future.error(e, trace);
      } finally {
        if (notifyListeners) {
          var event = new WebDriverCommandEvent(
              method: method,
              endPoint: command,
              params: params,
  
negative.code:             exception: exception,
              result: result,
              stackTrace: trace);
        }
      }
    }
  