Bug 1443923 - part5: Emit chrome-only event customelementdefined for DevTools;r=masayuki draft
authorJulian Descottes <jdescottes@mozilla.com>
Fri, 20 Jul 2018 11:01:43 +0200
changeset 822571 a1ea7c9a777550a731466c8eb203f11b16dda981
parent 822570 4441720ced7a9a9579e699d4722157d7e5a4bc03
child 822572 db9b069684939667ac9c78b5ef24b7ef445c7a82
push id117402
push userjdescottes@mozilla.com
push dateWed, 25 Jul 2018 13:32:04 +0000
reviewersmasayuki
bugs1443923
milestone63.0a1
Bug 1443923 - part5: Emit chrome-only event customelementdefined for DevTools;r=masayuki MozReview-Commit-ID: GCFhhpVj5VS
dom/base/CustomElementRegistry.cpp
--- a/dom/base/CustomElementRegistry.cpp
+++ b/dom/base/CustomElementRegistry.cpp
@@ -1,22 +1,24 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "mozilla/dom/CustomElementRegistry.h"
 
+#include "mozilla/AsyncEventDispatcher.h"
 #include "mozilla/CycleCollectedJSContext.h"
 #include "mozilla/dom/CustomElementRegistryBinding.h"
 #include "mozilla/dom/HTMLElementBinding.h"
 #include "mozilla/dom/Promise.h"
 #include "mozilla/dom/WebComponentsBinding.h"
 #include "mozilla/dom/DocGroup.h"
+#include "mozilla/dom/CustomEvent.h"
 #include "nsHTMLTags.h"
 #include "jsapi.h"
 #include "xpcprivate.h"
 #include "nsGlobalWindow.h"
 
 namespace mozilla {
 namespace dom {
 
@@ -961,16 +963,37 @@ CustomElementRegistry::Define(JSContext*
    *        when-defined promise map.
    */
   RefPtr<Promise> promise;
   mWhenDefinedPromiseMap.Remove(nameAtom, getter_AddRefs(promise));
   if (promise) {
     promise->MaybeResolveWithUndefined();
   }
 
+  // Dispatch a "customelementdefined" event for DevTools.
+  {
+    JSString* nameJsStr = JS_NewUCStringCopyN(aCx,
+                                              aName.BeginReading(),
+                                              aName.Length());
+
+    JS::Rooted<JS::Value> detail(aCx, JS::StringValue(nameJsStr));
+    RefPtr<CustomEvent> event = NS_NewDOMCustomEvent(doc, nullptr, nullptr);
+    event->InitCustomEvent(aCx,
+                           NS_LITERAL_STRING("customelementdefined"),
+                           /* CanBubble */ true,
+                           /* Cancelable */ true,
+                           detail);
+    event->SetTrusted(true);
+
+    AsyncEventDispatcher* dispatcher = new AsyncEventDispatcher(doc, event);
+    dispatcher->mOnlyChromeDispatch = ChromeOnlyDispatch::eYes;
+
+    dispatcher->PostDOMEvent();
+  }
+
   /**
    * Clean-up mElementCreationCallbacks (if it exists)
    */
   mElementCreationCallbacks.Remove(nameAtom);
 
 }
 
 void