Make sure each C++ WebContents has only one JS WebContents

This commit is contained in:
Cheng Zhao 2015-06-24 15:09:50 +08:00
parent 552a12d2ee
commit 1023b67d59
4 changed files with 21 additions and 2 deletions

View file

@ -784,6 +784,11 @@ bool WebContents::IsGuest() const {
return is_guest();
}
void WebContents::AfterInit(v8::Isolate* isolate) {
mate::TrackableObject::AfterInit(isolate);
AttachAsUserData(web_contents());
}
mate::ObjectTemplateBuilder WebContents::GetObjectTemplateBuilder(
v8::Isolate* isolate) {
if (template_.IsEmpty())
@ -873,6 +878,13 @@ gfx::Size WebContents::GetDefaultSize() const {
// static
mate::Handle<WebContents> WebContents::CreateFrom(
v8::Isolate* isolate, brightray::InspectableWebContents* web_contents) {
// We have an existing WebContents object in JS.
auto existing = TrackableObject::FromWrappedClass(
isolate, web_contents->GetWebContents());
if (existing)
return mate::CreateHandle(isolate, static_cast<WebContents*>(existing));
// Otherwise create a new WebContents wrapper object.
auto handle = mate::CreateHandle(isolate, new WebContents(web_contents));
g_wrap_web_contents.Run(handle.ToV8());
return handle;
@ -881,6 +893,12 @@ mate::Handle<WebContents> WebContents::CreateFrom(
// static
mate::Handle<WebContents> WebContents::CreateFrom(
v8::Isolate* isolate, content::WebContents* web_contents) {
// We have an existing WebContents object in JS.
auto existing = TrackableObject::FromWrappedClass(isolate, web_contents);
if (existing)
return mate::CreateHandle(isolate, static_cast<WebContents*>(existing));
// Otherwise create a new WebContents wrapper object.
auto handle = mate::CreateHandle(isolate, new WebContents(web_contents));
g_wrap_web_contents.Run(handle.ToV8());
return handle;

View file

@ -142,6 +142,7 @@ class WebContents : public mate::TrackableObject,
~WebContents();
// mate::Wrappable:
void AfterInit(v8::Isolate* isolate);
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) override;

View file

@ -65,7 +65,7 @@ void TrackableObject::AfterInit(v8::Isolate* isolate) {
weak_map_id_ = weak_map_.Add(isolate, GetWrapper(isolate));
}
void TrackableObject::Attach(base::SupportsUserData* wrapped) {
void TrackableObject::AttachAsUserData(base::SupportsUserData* wrapped) {
wrapped->SetUserData(kTrackedObjectKey, new IDUserData(weak_map_id_));
}

View file

@ -39,7 +39,7 @@ class TrackableObject : public mate::EventEmitter {
~TrackableObject() override;
// Wrap TrackableObject into a class that SupportsUserData.
void Attach(base::SupportsUserData* wrapped);
void AttachAsUserData(base::SupportsUserData* wrapped);
private:
static atom::IDWeakMap weak_map_;