Browse Source

feat: add osProcessId / name properties to webFrameMain (#26093)

* feat: add osProcessId / name properties to webFrameMain

* Update docs/api/web-frame-main.md

Co-authored-by: Jeremy Rose <[email protected]>

Co-authored-by: Jeremy Rose <[email protected]>
Milan Burda 4 years ago
parent
commit
aa157c3f05

+ 10 - 1
docs/api/web-frame-main.md

@@ -122,9 +122,18 @@ content. The identifier is fixed at the creation of the frame and stays
 constant for the lifetime of the frame. When the frame is removed, the id is
 not used again.
 
+#### `frame.name` _Readonly_
+
+A `String` representing the frame name.
+
+#### `frame.osProcessId` _Readonly_
+
+An `Integer` representing the operating system `pid` of the process which owns this frame.
+
 #### `frame.processId` _Readonly_
 
-An `Integer` representing the id of the process which owns this frame.
+An `Integer` representing the Chromium internal `pid` of the process which owns this frame.
+This is not the same as the OS process ID; to read that use `frame.osProcessId`.
 
 #### `frame.routingId` _Readonly_
 

+ 0 - 14
shell/browser/api/electron_api_web_contents.cc

@@ -1590,18 +1590,6 @@ base::ProcessId WebContents::GetOSProcessID() const {
   return base::GetProcId(process_handle);
 }
 
-base::ProcessId WebContents::GetOSProcessIdForFrame(
-    const std::string& name,
-    const std::string& document_url) const {
-  for (auto* frame : web_contents()->GetAllFrames()) {
-    if (frame->GetFrameName() == name &&
-        frame->GetLastCommittedURL().spec() == document_url) {
-      return base::GetProcId(frame->GetProcess()->GetProcess().Handle());
-    }
-  }
-  return base::kNullProcessId;
-}
-
 WebContents::Type WebContents::GetType() const {
   return type_;
 }
@@ -2941,8 +2929,6 @@ v8::Local<v8::ObjectTemplate> WebContents::FillObjectTemplate(
                  &WebContents::SetBackgroundThrottling)
       .SetMethod("getProcessId", &WebContents::GetProcessID)
       .SetMethod("getOSProcessId", &WebContents::GetOSProcessID)
-      .SetMethod("_getOSProcessIdForFrame",
-                 &WebContents::GetOSProcessIdForFrame)
       .SetMethod("equal", &WebContents::Equal)
       .SetMethod("_loadURL", &WebContents::LoadURL)
       .SetMethod("downloadURL", &WebContents::DownloadURL)

+ 0 - 2
shell/browser/api/electron_api_web_contents.h

@@ -209,8 +209,6 @@ class WebContents : public gin::Wrappable<WebContents>,
   void SetBackgroundThrottling(bool allowed);
   int GetProcessID() const;
   base::ProcessId GetOSProcessID() const;
-  base::ProcessId GetOSProcessIdForFrame(const std::string& name,
-                                         const std::string& document_url) const;
   Type GetType() const;
   bool Equal(const WebContents* web_contents) const;
   void LoadURL(const GURL& url, const gin_helper::Dictionary& options);

+ 16 - 0
shell/browser/api/electron_api_web_frame_main.cc

@@ -120,6 +120,20 @@ int WebFrameMain::FrameTreeNodeID(v8::Isolate* isolate) const {
   return render_frame_->GetFrameTreeNodeId();
 }
 
+std::string WebFrameMain::Name(v8::Isolate* isolate) const {
+  if (!CheckRenderFrame())
+    return std::string();
+  return render_frame_->GetFrameName();
+}
+
+base::ProcessId WebFrameMain::OSProcessID(v8::Isolate* isolate) const {
+  if (!CheckRenderFrame())
+    return -1;
+  base::ProcessHandle process_handle =
+      render_frame_->GetProcess()->GetProcess().Handle();
+  return base::GetProcId(process_handle);
+}
+
 int WebFrameMain::ProcessID(v8::Isolate* isolate) const {
   if (!CheckRenderFrame())
     return -1;
@@ -210,6 +224,8 @@ gin::ObjectTemplateBuilder WebFrameMain::GetObjectTemplateBuilder(
       .SetMethod("executeJavaScript", &WebFrameMain::ExecuteJavaScript)
       .SetMethod("reload", &WebFrameMain::Reload)
       .SetProperty("frameTreeNodeId", &WebFrameMain::FrameTreeNodeID)
+      .SetProperty("name", &WebFrameMain::Name)
+      .SetProperty("osProcessId", &WebFrameMain::OSProcessID)
       .SetProperty("processId", &WebFrameMain::ProcessID)
       .SetProperty("routingId", &WebFrameMain::RoutingID)
       .SetProperty("url", &WebFrameMain::URL)

+ 3 - 0
shell/browser/api/electron_api_web_frame_main.h

@@ -9,6 +9,7 @@
 #include <string>
 #include <vector>
 
+#include "base/process/process.h"
 #include "gin/handle.h"
 #include "gin/wrappable.h"
 
@@ -68,6 +69,8 @@ class WebFrameMain : public gin::Wrappable<WebFrameMain> {
   bool Reload(v8::Isolate* isolate);
 
   int FrameTreeNodeID(v8::Isolate* isolate) const;
+  std::string Name(v8::Isolate* isolate) const;
+  base::ProcessId OSProcessID(v8::Isolate* isolate) const;
   int ProcessID(v8::Isolate* isolate) const;
   int RoutingID(v8::Isolate* isolate) const;
   GURL URL(v8::Isolate* isolate) const;

+ 1 - 1
spec-main/api-subframe-spec.ts

@@ -216,7 +216,7 @@ ifdescribe(process.platform !== 'linux')('cross-site frame sandboxing', () => {
         await w.loadURL(serverUrl);
 
         const pidMain = w.webContents.getOSProcessId();
-        const pidFrame = (w.webContents as any)._getOSProcessIdForFrame('frame', crossSiteUrl);
+        const pidFrame = w.webContents.mainFrame.frames.find(f => f.name === 'frame')!.osProcessId;
 
         const metrics = app.getAppMetrics();
         const isProcessSandboxed = function (pid: number) {

+ 2 - 0
spec-main/api-web-frame-main-spec.ts

@@ -127,6 +127,8 @@ describe('webFrameMain module', () => {
       await w.loadFile(path.join(subframesPath, 'frame.html'));
       const webFrame = w.webContents.mainFrame;
       expect(webFrame).to.haveOwnProperty('frameTreeNodeId');
+      expect(webFrame).to.haveOwnProperty('name');
+      expect(webFrame).to.haveOwnProperty('osProcessId');
       expect(webFrame).to.haveOwnProperty('processId');
       expect(webFrame).to.haveOwnProperty('routingId');
     });