From 2b67b640120ee39b9028c68528d5f3585513e415 Mon Sep 17 00:00:00 2001 From: John Popovich Date: Fri, 16 Aug 2019 07:08:00 -0700 Subject: [PATCH 1/6] feat: Allow inspection of specific web workers --- docs/api/structures/shared-worker-info.md | 4 ++ docs/api/web-contents.md | 10 ++++ filenames.auto.gni | 1 + shell/browser/api/atom_api_web_contents.cc | 54 +++++++++++++++++++ shell/browser/api/atom_api_web_contents.h | 3 ++ spec/api-web-contents-spec.js | 39 ++++++++++++++ .../api/shared-worker/shared-worker1.js | 6 +++ .../api/shared-worker/shared-worker2.js | 7 +++ 8 files changed, 124 insertions(+) create mode 100644 docs/api/structures/shared-worker-info.md create mode 100644 spec/fixtures/api/shared-worker/shared-worker1.js create mode 100644 spec/fixtures/api/shared-worker/shared-worker2.js diff --git a/docs/api/structures/shared-worker-info.md b/docs/api/structures/shared-worker-info.md new file mode 100644 index 0000000000000..d968ab9110b40 --- /dev/null +++ b/docs/api/structures/shared-worker-info.md @@ -0,0 +1,4 @@ +# WorkerInfo Object + +* `id` String - The unique id of the shared worker +* `url` String - The url of the shared worker diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index f5d25bac82572..836d26e13762a 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -1461,6 +1461,16 @@ Starts inspecting element at position (`x`, `y`). Opens the developer tools for the shared worker context. +#### `contents.inspectSharedWorkerById(workerId)` + +* `workerId` String + +Inspects the shared worker based on its ID. + +#### `contents.getAllSharedWorkers()` + +Returns `WorkerInfo[]` - An array of WorkerInfo objects of sharedworkers. + #### `contents.inspectServiceWorker()` Opens the developer tools for the service worker context. diff --git a/filenames.auto.gni b/filenames.auto.gni index 28b36e7288d5e..5e7f57a25ccc6 100644 --- a/filenames.auto.gni +++ b/filenames.auto.gni @@ -110,6 +110,7 @@ auto_filenames = { "docs/api/structures/remove-password.md", "docs/api/structures/scrubber-item.md", "docs/api/structures/segmented-control-segment.md", + "docs/api/structures/shared-worker-info.md", "docs/api/structures/shortcut-details.md", "docs/api/structures/size.md", "docs/api/structures/stream-protocol-response.md", diff --git a/shell/browser/api/atom_api_web_contents.cc b/shell/browser/api/atom_api_web_contents.cc index c2bfdff13aa56..b3b30f3a66218 100644 --- a/shell/browser/api/atom_api_web_contents.cc +++ b/shell/browser/api/atom_api_web_contents.cc @@ -8,6 +8,7 @@ #include #include #include +#include #include "base/message_loop/message_loop_current.h" #include "base/no_destructor.h" @@ -293,6 +294,18 @@ struct Converter { } }; +template <> +struct Converter> { + static v8::Local ToV8( + v8::Isolate* isolate, + const scoped_refptr& val) { + mate::Dictionary dict(isolate, v8::Object::New(isolate)); + dict.Set("id", val->GetId()); + dict.Set("url", val->GetURL().spec()); + return dict.GetHandle(); + } +}; + } // namespace mate namespace electron { @@ -1522,6 +1535,44 @@ void WebContents::InspectElement(int x, int y) { managed_web_contents()->InspectElement(x, y); } +void WebContents::InspectSharedWorkerById(const std::string& workerId) { + if (type_ == Type::REMOTE) + return; + + if (!enable_devtools_) + return; + + for (const auto& agent_host : content::DevToolsAgentHost::GetOrCreateAll()) { + if (agent_host->GetType() == + content::DevToolsAgentHost::kTypeSharedWorker) { + if (agent_host->GetId() == workerId) { + OpenDevTools(nullptr); + managed_web_contents()->AttachTo(agent_host); + break; + } + } + } +} + +std::vector> +WebContents::GetAllSharedWorkers() { + std::vector> shared_workers; + + if (type_ == Type::REMOTE) + return shared_workers; + + if (!enable_devtools_) + return shared_workers; + + for (const auto& agent_host : content::DevToolsAgentHost::GetOrCreateAll()) { + if (agent_host->GetType() == + content::DevToolsAgentHost::kTypeSharedWorker) { + shared_workers.push_back(agent_host); + } + } + return shared_workers; +} + void WebContents::InspectSharedWorker() { if (type_ == Type::REMOTE) return; @@ -2457,6 +2508,9 @@ void WebContents::BuildPrototype(v8::Isolate* isolate, .SetMethod("getOwnerBrowserWindow", &WebContents::GetOwnerBrowserWindow) .SetMethod("inspectServiceWorker", &WebContents::InspectServiceWorker) .SetMethod("inspectSharedWorker", &WebContents::InspectSharedWorker) + .SetMethod("inspectSharedWorkerById", + &WebContents::InspectSharedWorkerById) + .SetMethod("getAllSharedWorkers", &WebContents::GetAllSharedWorkers) #if BUILDFLAG(ENABLE_PRINTING) .SetMethod("_print", &WebContents::Print) .SetMethod("_getPrinters", &WebContents::GetPrinterList) diff --git a/shell/browser/api/atom_api_web_contents.h b/shell/browser/api/atom_api_web_contents.h index aa63546f7d3d6..6f48ebe450d8d 100644 --- a/shell/browser/api/atom_api_web_contents.h +++ b/shell/browser/api/atom_api_web_contents.h @@ -13,6 +13,7 @@ #include "base/observer_list.h" #include "base/observer_list_types.h" #include "content/common/cursors/webcursor.h" +#include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/keyboard_event_processing_result.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/web_contents.h" @@ -171,6 +172,8 @@ class WebContents : public mate::TrackableObject, void DisableDeviceEmulation(); void InspectElement(int x, int y); void InspectSharedWorker(); + void InspectSharedWorkerById(const std::string& workerId); + std::vector> GetAllSharedWorkers(); void InspectServiceWorker(); void SetIgnoreMenuShortcuts(bool ignore); void SetAudioMuted(bool muted); diff --git a/spec/api-web-contents-spec.js b/spec/api-web-contents-spec.js index 7c556d644c6b2..b9868ba715549 100644 --- a/spec/api-web-contents-spec.js +++ b/spec/api-web-contents-spec.js @@ -1292,4 +1292,43 @@ describe('webContents module', () => { w.loadFile(path.join(fixtures, 'api', 'picture-in-picture.html')) }) }) + + // FIXME: disable during chromium update due to crash in content::WorkerScriptFetchInitation::CreateScriptLoaderOnIO + xdescribe('Shared Workers', () => { + let worker1 + let worker2 + let vectorOfWorkers + + before(() => { + worker1 = new SharedWorker('../fixtures/api/shared-worker/shared-worker1.js') + worker2 = new SharedWorker('../fixtures/api/shared-worker/shared-worker2.js') + worker1.port.start() + worker2.port.start() + }) + + after(() => { + worker1.port.close() + worker2.port.close() + }) + + it('can get multiple shared workers', () => { + const contents = webContents.getAllWebContents() + vectorOfWorkers = contents[0].getAllSharedWorkers() + + expect(vectorOfWorkers.length).to.equal(2) + expect(vectorOfWorkers[0].url).to.contain('shared-worker') + expect(vectorOfWorkers[1].url).to.contain('shared-worker') + }) + + it('can inspect a specific shared worker', (done) => { + const contents = webContents.getAllWebContents() + contents[0].once('devtools-opened', () => { + contents[0].closeDevTools() + }) + contents[0].once('devtools-closed', () => { + done() + }) + contents[0].inspectSharedWorkerById(vectorOfWorkers[0].id) + }) + }) }) diff --git a/spec/fixtures/api/shared-worker/shared-worker1.js b/spec/fixtures/api/shared-worker/shared-worker1.js new file mode 100644 index 0000000000000..efb2507353622 --- /dev/null +++ b/spec/fixtures/api/shared-worker/shared-worker1.js @@ -0,0 +1,6 @@ +self.onconnect = function (e) { + const port = e.ports[0] + port.onmessage = function (e) { + + } +} diff --git a/spec/fixtures/api/shared-worker/shared-worker2.js b/spec/fixtures/api/shared-worker/shared-worker2.js new file mode 100644 index 0000000000000..f63ed522e374c --- /dev/null +++ b/spec/fixtures/api/shared-worker/shared-worker2.js @@ -0,0 +1,7 @@ +self.onconnect = function (e) { + const port = e.ports[0] + + port.onmessage = function (e) { + + } +} From 17924b155cefe5c3962a285c54890ee827f00c01 Mon Sep 17 00:00:00 2001 From: John Popovich Date: Wed, 21 Aug 2019 10:43:33 -0700 Subject: [PATCH 2/6] fix: Formatting and initializing test variables. --- docs/api/structures/shared-worker-info.md | 4 ++-- docs/api/web-contents.md | 2 +- spec/api-web-contents-spec.js | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/api/structures/shared-worker-info.md b/docs/api/structures/shared-worker-info.md index d968ab9110b40..3c3aa4ffc20ce 100644 --- a/docs/api/structures/shared-worker-info.md +++ b/docs/api/structures/shared-worker-info.md @@ -1,4 +1,4 @@ # WorkerInfo Object -* `id` String - The unique id of the shared worker -* `url` String - The url of the shared worker +* `id` String - The unique id of the shared worker. +* `url` String - The url of the shared worker. diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index 836d26e13762a..d6674f54e731a 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -1469,7 +1469,7 @@ Inspects the shared worker based on its ID. #### `contents.getAllSharedWorkers()` -Returns `WorkerInfo[]` - An array of WorkerInfo objects of sharedworkers. +Returns `WorkerInfo[]` - Information about all Shared Workers. An empty array if there's no Shared Workers. #### `contents.inspectServiceWorker()` diff --git a/spec/api-web-contents-spec.js b/spec/api-web-contents-spec.js index b9868ba715549..14af476a53acb 100644 --- a/spec/api-web-contents-spec.js +++ b/spec/api-web-contents-spec.js @@ -1304,6 +1304,7 @@ describe('webContents module', () => { worker2 = new SharedWorker('../fixtures/api/shared-worker/shared-worker2.js') worker1.port.start() worker2.port.start() + vectorOfWorkers = [] }) after(() => { @@ -1312,8 +1313,8 @@ describe('webContents module', () => { }) it('can get multiple shared workers', () => { - const contents = webContents.getAllWebContents() - vectorOfWorkers = contents[0].getAllSharedWorkers() + const contents = remote.getCurrentWebContents() + vectorOfWorkers = contents.getAllSharedWorkers() expect(vectorOfWorkers.length).to.equal(2) expect(vectorOfWorkers[0].url).to.contain('shared-worker') From 8cf7e3e466ed5274450786fbad59002b054bd332 Mon Sep 17 00:00:00 2001 From: John Popovich Date: Thu, 22 Aug 2019 08:49:51 -0700 Subject: [PATCH 3/6] fix: Making tests independant and removing vector wording --- spec/api-web-contents-spec.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/spec/api-web-contents-spec.js b/spec/api-web-contents-spec.js index 14af476a53acb..97589f540c795 100644 --- a/spec/api-web-contents-spec.js +++ b/spec/api-web-contents-spec.js @@ -1297,14 +1297,14 @@ describe('webContents module', () => { xdescribe('Shared Workers', () => { let worker1 let worker2 - let vectorOfWorkers + let workers before(() => { worker1 = new SharedWorker('../fixtures/api/shared-worker/shared-worker1.js') worker2 = new SharedWorker('../fixtures/api/shared-worker/shared-worker2.js') worker1.port.start() worker2.port.start() - vectorOfWorkers = [] + workers = [] }) after(() => { @@ -1314,22 +1314,24 @@ describe('webContents module', () => { it('can get multiple shared workers', () => { const contents = remote.getCurrentWebContents() - vectorOfWorkers = contents.getAllSharedWorkers() + workers = contents.getAllSharedWorkers() - expect(vectorOfWorkers.length).to.equal(2) - expect(vectorOfWorkers[0].url).to.contain('shared-worker') - expect(vectorOfWorkers[1].url).to.contain('shared-worker') + expect(workers.length).to.equal(2) + expect(workers[0].url).to.contain('shared-worker') + expect(workers[1].url).to.contain('shared-worker') }) it('can inspect a specific shared worker', (done) => { const contents = webContents.getAllWebContents() - contents[0].once('devtools-opened', () => { - contents[0].closeDevTools() + workers = contents.getAllSharedWorkers() + + contents.once('devtools-opened', () => { + contents.closeDevTools() }) - contents[0].once('devtools-closed', () => { + contents.once('devtools-closed', () => { done() }) - contents[0].inspectSharedWorkerById(vectorOfWorkers[0].id) + contents.inspectSharedWorkerById(workers[0].id) }) }) }) From d5a377e0ce22326a5aaf1c37de41bf972c182446 Mon Sep 17 00:00:00 2001 From: John Popovich Date: Thu, 22 Aug 2019 08:54:03 -0700 Subject: [PATCH 4/6] fix: Changing name of array to be more specific --- spec/api-web-contents-spec.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/spec/api-web-contents-spec.js b/spec/api-web-contents-spec.js index 97589f540c795..6092defc844dc 100644 --- a/spec/api-web-contents-spec.js +++ b/spec/api-web-contents-spec.js @@ -1297,14 +1297,12 @@ describe('webContents module', () => { xdescribe('Shared Workers', () => { let worker1 let worker2 - let workers before(() => { worker1 = new SharedWorker('../fixtures/api/shared-worker/shared-worker1.js') worker2 = new SharedWorker('../fixtures/api/shared-worker/shared-worker2.js') worker1.port.start() worker2.port.start() - workers = [] }) after(() => { @@ -1314,16 +1312,16 @@ describe('webContents module', () => { it('can get multiple shared workers', () => { const contents = remote.getCurrentWebContents() - workers = contents.getAllSharedWorkers() + const sharedWorkers = contents.getAllSharedWorkers() - expect(workers.length).to.equal(2) - expect(workers[0].url).to.contain('shared-worker') - expect(workers[1].url).to.contain('shared-worker') + expect(sharedWorkers.length).to.equal(2) + expect(sharedWorkers[0].url).to.contain('shared-worker') + expect(sharedWorkers[1].url).to.contain('shared-worker') }) it('can inspect a specific shared worker', (done) => { const contents = webContents.getAllWebContents() - workers = contents.getAllSharedWorkers() + const sharedWorkers = contents.getAllSharedWorkers() contents.once('devtools-opened', () => { contents.closeDevTools() @@ -1331,7 +1329,7 @@ describe('webContents module', () => { contents.once('devtools-closed', () => { done() }) - contents.inspectSharedWorkerById(workers[0].id) + contents.inspectSharedWorkerById(sharedWorkers[0].id) }) }) }) From 279d5c96d6a30da9f12a3399fe0b80ed71ec26ba Mon Sep 17 00:00:00 2001 From: John Popovich Date: Tue, 27 Aug 2019 09:37:26 -0700 Subject: [PATCH 5/6] fix: Fix lint issue of trailing space in test file --- spec/api-web-contents-spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/api-web-contents-spec.js b/spec/api-web-contents-spec.js index 6092defc844dc..a50d7ffdb5802 100644 --- a/spec/api-web-contents-spec.js +++ b/spec/api-web-contents-spec.js @@ -1293,7 +1293,7 @@ describe('webContents module', () => { }) }) - // FIXME: disable during chromium update due to crash in content::WorkerScriptFetchInitation::CreateScriptLoaderOnIO + // FIXME: disable during chromium update due to crash in content::WorkerScriptFetchInitation::CreateScriptLoaderOnIO. xdescribe('Shared Workers', () => { let worker1 let worker2 From cfac00fdba70147030aafd743eefe2e3fe47ba5d Mon Sep 17 00:00:00 2001 From: John Popovich Date: Thu, 29 Aug 2019 15:53:31 -0700 Subject: [PATCH 6/6] fix: Using correct api calls in shared worker tests --- spec/api-web-contents-spec.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/spec/api-web-contents-spec.js b/spec/api-web-contents-spec.js index a50d7ffdb5802..e9c67591e3140 100644 --- a/spec/api-web-contents-spec.js +++ b/spec/api-web-contents-spec.js @@ -1293,8 +1293,7 @@ describe('webContents module', () => { }) }) - // FIXME: disable during chromium update due to crash in content::WorkerScriptFetchInitation::CreateScriptLoaderOnIO. - xdescribe('Shared Workers', () => { + describe('Shared Workers', () => { let worker1 let worker2 @@ -1320,7 +1319,7 @@ describe('webContents module', () => { }) it('can inspect a specific shared worker', (done) => { - const contents = webContents.getAllWebContents() + const contents = remote.getCurrentWebContents() const sharedWorkers = contents.getAllSharedWorkers() contents.once('devtools-opened', () => {