### Issue Details

* **Electron Version:**
  * 12, 11, 10, 9
* **Operating System:**
  * all
* **Last Known Working Electron version:**
  * NA

### Expected Behavior
The Promise returned by `contentTracing.stopTracing()` should always either resolve or reject.

### Actual Behavior
If called when a trace is not in progress, `contentTracing.stopTracing()` never resolves or rejects.

### To Reproduce
https://gist.github.com/8eb40af81ba15dbe4c50735a6ec4489d

note `'done'` is never printed.
shell/browser/api/electron_api_content_tracing.cc
gin_helper::Promise<gin_helper::Dictionary> promise,
    float percent_full,
    size_t approximate_count) {
  gin_helper::Dictionary dict = gin::Dictionary::CreateEmpty(promise.isolate());
  dict.Set("percentage", percent_full);
  dict.Set("value", approximate_count);
  promise.Resolve(dict);
}
v8::Local<v8::Promise> GetTraceBufferUsage(v8::Isolate* isolate) {
  gin_helper::Promise<gin_helper::Dictionary> promise(isolate);
  v8::Local<v8::Promise> handle = promise.GetHandle();
  
  TracingController::GetInstance()->GetTraceBufferUsage(
      base::BindOnce(&OnTraceBufferUsageAvailable, std::move(promise)));
  return handle;
}
void Initialize(v8::Local<v8::Object> exports,
                v8::Local<v8::Value> unused,
                v8::Local<v8::Context> context,
                void* priv) {
  gin_helper::Dictionary dict(context->GetIsolate(), exports);
  dict.SetMethod("getCategories", &GetCategories);
  dict.SetMethod("startRecording", &StartTracing);
  dict.SetMethod("stopRecording", &StopRecording);
  dict.SetMethod("getTraceBufferUsage", &GetTraceBufferUsage);
}
}  
NODE_LINKED_MODULE_CONTEXT_AWARE(electron_browser_content_tracing, Initialize)