2

Am trying to migrate a toggle to manifest V3, this toggles between web and mobile view. With new declarativeNetRequest am able to modify the header, but it does not reload page. Ideally after applying new mobile user agent, It supposed to reload and load page in mobile view.

I have declared dynamic rule in declarativeNetRequest as below:

const rules  = {
        addRules: [
          {
            id: 36,
            priority: 2,
            action: {
              type: 'modifyHeaders' as chrome.declarativeNetRequest.RuleActionType,
              requestHeaders: [
                {
                  header: 'user-agent',
                  operation: 'set' as chrome.declarativeNetRequest.HeaderOperation,
                  value: `mobileUserAgent`,
                },
              ],
            },
            condition: {
            urlFilter: 'example.com',
              resourceTypes: [
                'main_frame' as chrome.declarativeNetRequest.ResourceType,
                'xmlhttprequest' as chrome.declarativeNetRequest.ResourceType,
                ],
            },
          },
        ],
      }

     chrome.declarativeNetRequest.updateDynamicRules(rules, () => {
        if (chrome.runtime.lastError) {
          console.error(chrome.runtime.lastError)
        } else {
          chrome.declarativeNetRequest.getDynamicRules(rules => console.log(rules))
        }
      })

It does update the value when checking in chrome dev tool, but it does not refresh the page and does not load mobile view with new user agent.

FYI this is old way of doing this and it works fine, but it does not support in manifest V3 This is old way of modifying headers.

chrome.webRequest.onBeforeSendHeaders.addListener(
  function (details) {
    for (var i = 0; i < details.requestHeaders.length; ++i) {
      if (details.requestHeaders[i].name === 'User-Agent') {
        details.requestHeaders[i].value = details.requestHeaders[i].value + ' OurUAToken/1.0';
        break;
      }
    }
    return { requestHeaders: details.requestHeaders };
  },
  { urls: ['<all_urls>'] },
  ['blocking', 'requestHeaders']
);

what would be equivalent of chrome.webRequest.onBeforeSendHeaders.addListener in manifest V3?

ankitd
  • 1,967
  • 3
  • 26
  • 44
  • Both approaches do not reload the page, they both modify the outgoing request. The difference is that the first code sets a limited resourceTypes. Try removing it. Also, devtools has bugs with showing DNR headers, so it's better to verify in an external tool like Fiddler, Charles, WireShark, etc. – wOxxOm Aug 15 '22 at 14:57

1 Answers1

0

After running your code, the tabs will use your mobile user agent. The tabs before running this code need to be reloaded with another code. Here's an example:

    chrome.windows.getCurrent({populate:true},function(window){ 
    for(var tab of window.tabs){
        for(var site of ["example.com"]){
            if(tab.url && tab.url.indexOf(site) >= 0)chrome.tabs.reload(tab.id);
        }
    }
});
T.S.
  • 1