Browse Source

fix: `chrome.tabs.update` return value (#39388)

fix: chrome.tabs.update return value

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <[email protected]>
trop[bot] 1 year ago
parent
commit
174696e604

+ 14 - 0
shell/browser/extensions/api/tabs/tabs_api.cc

@@ -57,6 +57,14 @@ void ZoomModeToZoomSettings(WebContentsZoomController::ZoomMode zoom_mode,
       break;
   }
 }
+
+api::tabs::MutedInfo CreateMutedInfo(content::WebContents* contents) {
+  DCHECK(contents);
+  api::tabs::MutedInfo info;
+  info.muted = contents->IsAudioMuted();
+  info.reason = api::tabs::MUTED_INFO_REASON_USER;
+  return info;
+}
 }  // namespace
 
 ExecuteCodeInTabFunction::ExecuteCodeInTabFunction() : execute_tab_id_(-1) {}
@@ -502,11 +510,17 @@ ExtensionFunction::ResponseValue TabsUpdateFunction::GetResult() {
 
   auto* api_web_contents = electron::api::WebContents::From(web_contents_);
   tab.id = (api_web_contents ? api_web_contents->ID() : -1);
+
   // TODO(nornagon): in Chrome, the tab URL is only available to extensions
   // that have the "tabs" (or "activeTab") permission. We should do the same
   // permission check here.
   tab.url = web_contents_->GetLastCommittedURL().spec();
 
+  if (api_web_contents)
+    tab.active = api_web_contents->IsFocused();
+  tab.muted_info = CreateMutedInfo(web_contents_);
+  tab.audible = web_contents_->IsCurrentlyAudible();
+
   return ArgumentList(tabs::Get::Results::Create(std::move(tab)));
 }
 

+ 17 - 0
spec/extensions-spec.ts

@@ -918,6 +918,23 @@ describe('chrome extensions', () => {
           expect(response.status).to.equal('reloaded');
         });
       });
+
+      it('update', async () => {
+        await w.loadURL(url);
+
+        const message = { method: 'update', args: [{ muted: true }] };
+        w.webContents.executeJavaScript(`window.postMessage('${JSON.stringify(message)}', '*')`);
+
+        const [,, responseString] = await once(w.webContents, 'console-message');
+        const response = JSON.parse(responseString);
+
+        expect(response).to.have.property('mutedInfo').that.is.a('object');
+        const { mutedInfo } = response;
+        expect(mutedInfo).to.deep.eq({
+          muted: true,
+          reason: 'user'
+        });
+      });
     });
   });
 });

+ 7 - 0
spec/fixtures/extensions/tabs-api-async/background.js

@@ -42,6 +42,13 @@ const handleRequest = (request, sender, sendResponse) => {
       chrome.tabs.reload(tabId).then(() => {
         sendResponse({ status: 'reloaded' });
       });
+      break;
+    }
+
+    case 'update': {
+      const [params] = args;
+      chrome.tabs.update(tabId, params).then(sendResponse);
+      break;
     }
   }
 };

+ 5 - 0
spec/fixtures/extensions/tabs-api-async/main.js

@@ -34,6 +34,11 @@ const testMap = {
     chrome.runtime.sendMessage({ method: 'reload' }, response => {
       console.log(JSON.stringify(response));
     });
+  },
+  update (params) {
+    chrome.runtime.sendMessage({ method: 'update', args: [params] }, response => {
+      console.log(JSON.stringify(response));
+    });
   }
 };