|
@@ -56,37 +56,52 @@ namespace electron {
|
|
|
|
|
|
namespace api {
|
|
|
|
|
|
-typedef std::unordered_map<content::RenderFrameHost*, WebFrameMain*>
|
|
|
- RenderFrameMap;
|
|
|
-base::LazyInstance<RenderFrameMap>::DestructorAtExit g_render_frame_map =
|
|
|
- LAZY_INSTANCE_INITIALIZER;
|
|
|
+typedef std::unordered_map<int, WebFrameMain*> WebFrameMainIdMap;
|
|
|
+
|
|
|
+base::LazyInstance<WebFrameMainIdMap>::DestructorAtExit
|
|
|
+ g_web_frame_main_id_map = LAZY_INSTANCE_INITIALIZER;
|
|
|
|
|
|
// static
|
|
|
-WebFrameMain* WebFrameMain::From(content::RenderFrameHost* rfh) {
|
|
|
- auto frame_map = g_render_frame_map.Get();
|
|
|
- auto iter = frame_map.find(rfh);
|
|
|
+WebFrameMain* WebFrameMain::FromFrameTreeNodeId(int frame_tree_node_id) {
|
|
|
+ auto frame_map = g_web_frame_main_id_map.Get();
|
|
|
+ auto iter = frame_map.find(frame_tree_node_id);
|
|
|
auto* web_frame = iter == frame_map.end() ? nullptr : iter->second;
|
|
|
return web_frame;
|
|
|
}
|
|
|
|
|
|
+// static
|
|
|
+WebFrameMain* WebFrameMain::FromRenderFrameHost(content::RenderFrameHost* rfh) {
|
|
|
+ return rfh ? FromFrameTreeNodeId(rfh->GetFrameTreeNodeId()) : nullptr;
|
|
|
+}
|
|
|
+
|
|
|
gin::WrapperInfo WebFrameMain::kWrapperInfo = {gin::kEmbedderNativeGin};
|
|
|
|
|
|
-WebFrameMain::WebFrameMain(content::RenderFrameHost* rfh) : render_frame_(rfh) {
|
|
|
- g_render_frame_map.Get().emplace(rfh, this);
|
|
|
+WebFrameMain::WebFrameMain(content::RenderFrameHost* rfh)
|
|
|
+ : frame_tree_node_id_(rfh->GetFrameTreeNodeId()), render_frame_(rfh) {
|
|
|
+ g_web_frame_main_id_map.Get().emplace(frame_tree_node_id_, this);
|
|
|
}
|
|
|
|
|
|
WebFrameMain::~WebFrameMain() {
|
|
|
+ Destroyed();
|
|
|
+}
|
|
|
+
|
|
|
+void WebFrameMain::Destroyed() {
|
|
|
MarkRenderFrameDisposed();
|
|
|
+ g_web_frame_main_id_map.Get().erase(frame_tree_node_id_);
|
|
|
+ Unpin();
|
|
|
}
|
|
|
|
|
|
void WebFrameMain::MarkRenderFrameDisposed() {
|
|
|
- if (render_frame_disposed_)
|
|
|
- return;
|
|
|
- Unpin();
|
|
|
- g_render_frame_map.Get().erase(render_frame_);
|
|
|
+ render_frame_ = nullptr;
|
|
|
render_frame_disposed_ = true;
|
|
|
}
|
|
|
|
|
|
+void WebFrameMain::UpdateRenderFrameHost(content::RenderFrameHost* rfh) {
|
|
|
+ // Should only be called when swapping frames.
|
|
|
+ DCHECK(render_frame_);
|
|
|
+ render_frame_ = rfh;
|
|
|
+}
|
|
|
+
|
|
|
bool WebFrameMain::CheckRenderFrame() const {
|
|
|
if (render_frame_disposed_) {
|
|
|
v8::Isolate* isolate = JavascriptEnvironment::GetIsolate();
|
|
@@ -214,9 +229,7 @@ void WebFrameMain::PostMessage(v8::Isolate* isolate,
|
|
|
}
|
|
|
|
|
|
int WebFrameMain::FrameTreeNodeID() const {
|
|
|
- if (!CheckRenderFrame())
|
|
|
- return -1;
|
|
|
- return render_frame_->GetFrameTreeNodeId();
|
|
|
+ return frame_tree_node_id_;
|
|
|
}
|
|
|
|
|
|
std::string WebFrameMain::Name() const {
|
|
@@ -311,7 +324,7 @@ gin::Handle<WebFrameMain> WebFrameMain::From(v8::Isolate* isolate,
|
|
|
content::RenderFrameHost* rfh) {
|
|
|
if (rfh == nullptr)
|
|
|
return gin::Handle<WebFrameMain>();
|
|
|
- auto* web_frame = From(rfh);
|
|
|
+ auto* web_frame = FromRenderFrameHost(rfh);
|
|
|
if (web_frame)
|
|
|
return gin::CreateHandle(isolate, web_frame);
|
|
|
|
|
@@ -323,15 +336,6 @@ gin::Handle<WebFrameMain> WebFrameMain::From(v8::Isolate* isolate,
|
|
|
return handle;
|
|
|
}
|
|
|
|
|
|
-// static
|
|
|
-gin::Handle<WebFrameMain> WebFrameMain::FromID(v8::Isolate* isolate,
|
|
|
- int render_process_id,
|
|
|
- int render_frame_id) {
|
|
|
- auto* rfh =
|
|
|
- content::RenderFrameHost::FromID(render_process_id, render_frame_id);
|
|
|
- return From(isolate, rfh);
|
|
|
-}
|
|
|
-
|
|
|
// static
|
|
|
v8::Local<v8::ObjectTemplate> WebFrameMain::FillObjectTemplate(
|
|
|
v8::Isolate* isolate,
|
|
@@ -375,9 +379,10 @@ v8::Local<v8::Value> FromID(gin_helper::ErrorThrower thrower,
|
|
|
return v8::Null(thrower.isolate());
|
|
|
}
|
|
|
|
|
|
- return WebFrameMain::FromID(thrower.isolate(), render_process_id,
|
|
|
- render_frame_id)
|
|
|
- .ToV8();
|
|
|
+ auto* rfh =
|
|
|
+ content::RenderFrameHost::FromID(render_process_id, render_frame_id);
|
|
|
+
|
|
|
+ return WebFrameMain::From(thrower.isolate(), rfh).ToV8();
|
|
|
}
|
|
|
|
|
|
void Initialize(v8::Local<v8::Object> exports,
|