firefox addon: cannot update tab URL using web extension












0















I'd like to know how to update URL addresses in Firefox using Web Extensions.



I'm trying to port a simple extension I've created with Chrome APIs to Firefox, but I don't really understand the tab URL mechanisms in Firefox.



This extension was made to switch between YouTube desktop/TV version with a click.



It works well on Chrome, but I don't know why it's not working on Firefox.



UPDATE 1: Placing most important code block related to the question:



chromeApi.browserAction.onClicked.addListener(function(tab) {
var actionUrl = '';
var tabUrl = tab.url;

if (getCurrentPageVersion(tabUrl) !== undefined) {
actionUrl = getConvertedActionUrl(tabUrl);
if (actionUrl !== tabUrl) {
chromeApi.tabs.update(tab.id, {url: actionUrl});
}
}

});


Full source



(function(chromeApi) {

getCurrentPageVersion = function (tabUrl) {
var ytValidRegex = /^(https?://)?(www.)?(youtube.com|youtu.?be)/g;
var ytValidStdPageRegex = /^(https?://)?(www.)?(youtube.com|youtu.?be)?(/watch?v=).+$/g;
var ytValidTvPageRegex = /^(https?://)?(www.)?(youtube.com|youtu.?be)?(/tv#/watch(/video)?/(idle|control)?v=).+$/g;

if (!ytValidRegex.test(tabUrl)) {
return undefined;
} else if (ytValidStdPageRegex.test(tabUrl)) {
return "std";
} else if (ytValidTvPageRegex.test(tabUrl)) {
return "tv";
}

return undefined;
};

getConvertedActionUrl = function (tabUrl) {
var result = '';

var shortStdYtUrlRegex = //watch?v=.+/g;
var shortTvYtUrlRegex = //tv#/watch/video/(idle|control)?v=.+/g;
var shortStdYtUrlReplaceRegex = //watch?v=/g;
var shortTvYtUrlReplaceRegex = //tv#/watch/video/(idle|control)?v=/g;

if (shortStdYtUrlRegex.test(tabUrl)) {
result = tabUrl.replace(shortStdYtUrlReplaceRegex, '/tv#/watch/idle?v=');
}

else {
result = tabUrl.replace(shortTvYtUrlReplaceRegex, '/watch?v=');
}

// YouTube standard website video url
//https://www.youtube.com/watch?v=9tRDQK2MtRs
// YouTube TV url
//https://www.youtube.com/tv#/watch/video/idle?v=9tRDQK2MtRs
return result;
}

onInit = function () {

};

// Called when the user clicks on the browser action.
chromeApi.browserAction.onClicked.addListener(function(tab) {
var actionUrl = '';
var tabUrl = tab.url;

if (getCurrentPageVersion(tabUrl) !== undefined) {
actionUrl = getConvertedActionUrl(tabUrl);
if (actionUrl !== tabUrl) {
chromeApi.tabs.update(tab.id, {url: actionUrl});
}
}

});

chromeApi.tabs.onUpdated.addListener(function(tabId, changeInfo, tab){
if(!changeInfo.url) return; // URL did not change
// Might be better to analyze the URL to exclude things like anchor changes
var pageVersion = getCurrentPageVersion(tab.url);
if (pageVersion === undefined) return;

/* ... */
chromeApi.browserAction.setBadgeText({text: pageVersion.toUpperCase(), tabId: tab.id});
});

chromeApi.tabs.onCreated.addListener(function(tab){
var pageVersion = getCurrentPageVersion(tab.url);
if (pageVersion === undefined) return;

/* ... */
chromeApi.browserAction.setBadgeText({text: pageVersion.toUpperCase(), tabId: tab.id});
});

})(chrome);


If you pay attention, the core functionality happens on the chromeApi.browserAction.onClicked event, whenever you click the add-on/extension button.



The extension updates correctly between each YouTube version in Chrome, but in Firefox, this one redirects to YouTube TV once and never goes back to the desktop version no matter how many times you click on it.



But there's something weird in Firefox: browser history is updated correctly whenever the tab.update method is called, but it redirects to the TV version by itself again.



IMPORTANT: Both Firefox/Chrome extensions are using the currentTab permission, so it's not an extension issue by itself.



Extension on GitHub



UPDATE 2 (2018-11-25): I've updated the source code based on previous feedback










share|improve this question

























  • Side question: Why are you using the pattern (function(chromeApi) {})(chrome);? I note that you are only using chromeApi.* in some places in your code, with an number of calls to chrome.* within the function.

    – Makyen
    Nov 25 '18 at 0:57











  • @Makyen I'll try to remove them first. I was having some badge update issues with Chrome, however It could be my fault in somewhere else in my code.

    – adane1631
    Nov 25 '18 at 1:01











  • Please show your actual code. Where is this block of code located? Is it located within something else that calls this block? Is it your background script? You have a comment that says // Called when the user clicks on the browser action. for this entire section, but you call chromeApi.browserAction.onClicked.addListener() with an anonymous function from within this code. Does that mean you're adding an additional listener each time the browserAction button is clicked? Or, is this the setup code for your only one browserAction onClicked listener?

    – Makyen
    Nov 25 '18 at 1:01











  • It's the setup for one onClicked listener addition (at least that what I actually expects to do) Also, comments in my code are a mess, so I'll try organize them as much as possible. And this is the actual code as well.

    – adane1631
    Nov 25 '18 at 1:13
















0















I'd like to know how to update URL addresses in Firefox using Web Extensions.



I'm trying to port a simple extension I've created with Chrome APIs to Firefox, but I don't really understand the tab URL mechanisms in Firefox.



This extension was made to switch between YouTube desktop/TV version with a click.



It works well on Chrome, but I don't know why it's not working on Firefox.



UPDATE 1: Placing most important code block related to the question:



chromeApi.browserAction.onClicked.addListener(function(tab) {
var actionUrl = '';
var tabUrl = tab.url;

if (getCurrentPageVersion(tabUrl) !== undefined) {
actionUrl = getConvertedActionUrl(tabUrl);
if (actionUrl !== tabUrl) {
chromeApi.tabs.update(tab.id, {url: actionUrl});
}
}

});


Full source



(function(chromeApi) {

getCurrentPageVersion = function (tabUrl) {
var ytValidRegex = /^(https?://)?(www.)?(youtube.com|youtu.?be)/g;
var ytValidStdPageRegex = /^(https?://)?(www.)?(youtube.com|youtu.?be)?(/watch?v=).+$/g;
var ytValidTvPageRegex = /^(https?://)?(www.)?(youtube.com|youtu.?be)?(/tv#/watch(/video)?/(idle|control)?v=).+$/g;

if (!ytValidRegex.test(tabUrl)) {
return undefined;
} else if (ytValidStdPageRegex.test(tabUrl)) {
return "std";
} else if (ytValidTvPageRegex.test(tabUrl)) {
return "tv";
}

return undefined;
};

getConvertedActionUrl = function (tabUrl) {
var result = '';

var shortStdYtUrlRegex = //watch?v=.+/g;
var shortTvYtUrlRegex = //tv#/watch/video/(idle|control)?v=.+/g;
var shortStdYtUrlReplaceRegex = //watch?v=/g;
var shortTvYtUrlReplaceRegex = //tv#/watch/video/(idle|control)?v=/g;

if (shortStdYtUrlRegex.test(tabUrl)) {
result = tabUrl.replace(shortStdYtUrlReplaceRegex, '/tv#/watch/idle?v=');
}

else {
result = tabUrl.replace(shortTvYtUrlReplaceRegex, '/watch?v=');
}

// YouTube standard website video url
//https://www.youtube.com/watch?v=9tRDQK2MtRs
// YouTube TV url
//https://www.youtube.com/tv#/watch/video/idle?v=9tRDQK2MtRs
return result;
}

onInit = function () {

};

// Called when the user clicks on the browser action.
chromeApi.browserAction.onClicked.addListener(function(tab) {
var actionUrl = '';
var tabUrl = tab.url;

if (getCurrentPageVersion(tabUrl) !== undefined) {
actionUrl = getConvertedActionUrl(tabUrl);
if (actionUrl !== tabUrl) {
chromeApi.tabs.update(tab.id, {url: actionUrl});
}
}

});

chromeApi.tabs.onUpdated.addListener(function(tabId, changeInfo, tab){
if(!changeInfo.url) return; // URL did not change
// Might be better to analyze the URL to exclude things like anchor changes
var pageVersion = getCurrentPageVersion(tab.url);
if (pageVersion === undefined) return;

/* ... */
chromeApi.browserAction.setBadgeText({text: pageVersion.toUpperCase(), tabId: tab.id});
});

chromeApi.tabs.onCreated.addListener(function(tab){
var pageVersion = getCurrentPageVersion(tab.url);
if (pageVersion === undefined) return;

/* ... */
chromeApi.browserAction.setBadgeText({text: pageVersion.toUpperCase(), tabId: tab.id});
});

})(chrome);


If you pay attention, the core functionality happens on the chromeApi.browserAction.onClicked event, whenever you click the add-on/extension button.



The extension updates correctly between each YouTube version in Chrome, but in Firefox, this one redirects to YouTube TV once and never goes back to the desktop version no matter how many times you click on it.



But there's something weird in Firefox: browser history is updated correctly whenever the tab.update method is called, but it redirects to the TV version by itself again.



IMPORTANT: Both Firefox/Chrome extensions are using the currentTab permission, so it's not an extension issue by itself.



Extension on GitHub



UPDATE 2 (2018-11-25): I've updated the source code based on previous feedback










share|improve this question

























  • Side question: Why are you using the pattern (function(chromeApi) {})(chrome);? I note that you are only using chromeApi.* in some places in your code, with an number of calls to chrome.* within the function.

    – Makyen
    Nov 25 '18 at 0:57











  • @Makyen I'll try to remove them first. I was having some badge update issues with Chrome, however It could be my fault in somewhere else in my code.

    – adane1631
    Nov 25 '18 at 1:01











  • Please show your actual code. Where is this block of code located? Is it located within something else that calls this block? Is it your background script? You have a comment that says // Called when the user clicks on the browser action. for this entire section, but you call chromeApi.browserAction.onClicked.addListener() with an anonymous function from within this code. Does that mean you're adding an additional listener each time the browserAction button is clicked? Or, is this the setup code for your only one browserAction onClicked listener?

    – Makyen
    Nov 25 '18 at 1:01











  • It's the setup for one onClicked listener addition (at least that what I actually expects to do) Also, comments in my code are a mess, so I'll try organize them as much as possible. And this is the actual code as well.

    – adane1631
    Nov 25 '18 at 1:13














0












0








0








I'd like to know how to update URL addresses in Firefox using Web Extensions.



I'm trying to port a simple extension I've created with Chrome APIs to Firefox, but I don't really understand the tab URL mechanisms in Firefox.



This extension was made to switch between YouTube desktop/TV version with a click.



It works well on Chrome, but I don't know why it's not working on Firefox.



UPDATE 1: Placing most important code block related to the question:



chromeApi.browserAction.onClicked.addListener(function(tab) {
var actionUrl = '';
var tabUrl = tab.url;

if (getCurrentPageVersion(tabUrl) !== undefined) {
actionUrl = getConvertedActionUrl(tabUrl);
if (actionUrl !== tabUrl) {
chromeApi.tabs.update(tab.id, {url: actionUrl});
}
}

});


Full source



(function(chromeApi) {

getCurrentPageVersion = function (tabUrl) {
var ytValidRegex = /^(https?://)?(www.)?(youtube.com|youtu.?be)/g;
var ytValidStdPageRegex = /^(https?://)?(www.)?(youtube.com|youtu.?be)?(/watch?v=).+$/g;
var ytValidTvPageRegex = /^(https?://)?(www.)?(youtube.com|youtu.?be)?(/tv#/watch(/video)?/(idle|control)?v=).+$/g;

if (!ytValidRegex.test(tabUrl)) {
return undefined;
} else if (ytValidStdPageRegex.test(tabUrl)) {
return "std";
} else if (ytValidTvPageRegex.test(tabUrl)) {
return "tv";
}

return undefined;
};

getConvertedActionUrl = function (tabUrl) {
var result = '';

var shortStdYtUrlRegex = //watch?v=.+/g;
var shortTvYtUrlRegex = //tv#/watch/video/(idle|control)?v=.+/g;
var shortStdYtUrlReplaceRegex = //watch?v=/g;
var shortTvYtUrlReplaceRegex = //tv#/watch/video/(idle|control)?v=/g;

if (shortStdYtUrlRegex.test(tabUrl)) {
result = tabUrl.replace(shortStdYtUrlReplaceRegex, '/tv#/watch/idle?v=');
}

else {
result = tabUrl.replace(shortTvYtUrlReplaceRegex, '/watch?v=');
}

// YouTube standard website video url
//https://www.youtube.com/watch?v=9tRDQK2MtRs
// YouTube TV url
//https://www.youtube.com/tv#/watch/video/idle?v=9tRDQK2MtRs
return result;
}

onInit = function () {

};

// Called when the user clicks on the browser action.
chromeApi.browserAction.onClicked.addListener(function(tab) {
var actionUrl = '';
var tabUrl = tab.url;

if (getCurrentPageVersion(tabUrl) !== undefined) {
actionUrl = getConvertedActionUrl(tabUrl);
if (actionUrl !== tabUrl) {
chromeApi.tabs.update(tab.id, {url: actionUrl});
}
}

});

chromeApi.tabs.onUpdated.addListener(function(tabId, changeInfo, tab){
if(!changeInfo.url) return; // URL did not change
// Might be better to analyze the URL to exclude things like anchor changes
var pageVersion = getCurrentPageVersion(tab.url);
if (pageVersion === undefined) return;

/* ... */
chromeApi.browserAction.setBadgeText({text: pageVersion.toUpperCase(), tabId: tab.id});
});

chromeApi.tabs.onCreated.addListener(function(tab){
var pageVersion = getCurrentPageVersion(tab.url);
if (pageVersion === undefined) return;

/* ... */
chromeApi.browserAction.setBadgeText({text: pageVersion.toUpperCase(), tabId: tab.id});
});

})(chrome);


If you pay attention, the core functionality happens on the chromeApi.browserAction.onClicked event, whenever you click the add-on/extension button.



The extension updates correctly between each YouTube version in Chrome, but in Firefox, this one redirects to YouTube TV once and never goes back to the desktop version no matter how many times you click on it.



But there's something weird in Firefox: browser history is updated correctly whenever the tab.update method is called, but it redirects to the TV version by itself again.



IMPORTANT: Both Firefox/Chrome extensions are using the currentTab permission, so it's not an extension issue by itself.



Extension on GitHub



UPDATE 2 (2018-11-25): I've updated the source code based on previous feedback










share|improve this question
















I'd like to know how to update URL addresses in Firefox using Web Extensions.



I'm trying to port a simple extension I've created with Chrome APIs to Firefox, but I don't really understand the tab URL mechanisms in Firefox.



This extension was made to switch between YouTube desktop/TV version with a click.



It works well on Chrome, but I don't know why it's not working on Firefox.



UPDATE 1: Placing most important code block related to the question:



chromeApi.browserAction.onClicked.addListener(function(tab) {
var actionUrl = '';
var tabUrl = tab.url;

if (getCurrentPageVersion(tabUrl) !== undefined) {
actionUrl = getConvertedActionUrl(tabUrl);
if (actionUrl !== tabUrl) {
chromeApi.tabs.update(tab.id, {url: actionUrl});
}
}

});


Full source



(function(chromeApi) {

getCurrentPageVersion = function (tabUrl) {
var ytValidRegex = /^(https?://)?(www.)?(youtube.com|youtu.?be)/g;
var ytValidStdPageRegex = /^(https?://)?(www.)?(youtube.com|youtu.?be)?(/watch?v=).+$/g;
var ytValidTvPageRegex = /^(https?://)?(www.)?(youtube.com|youtu.?be)?(/tv#/watch(/video)?/(idle|control)?v=).+$/g;

if (!ytValidRegex.test(tabUrl)) {
return undefined;
} else if (ytValidStdPageRegex.test(tabUrl)) {
return "std";
} else if (ytValidTvPageRegex.test(tabUrl)) {
return "tv";
}

return undefined;
};

getConvertedActionUrl = function (tabUrl) {
var result = '';

var shortStdYtUrlRegex = //watch?v=.+/g;
var shortTvYtUrlRegex = //tv#/watch/video/(idle|control)?v=.+/g;
var shortStdYtUrlReplaceRegex = //watch?v=/g;
var shortTvYtUrlReplaceRegex = //tv#/watch/video/(idle|control)?v=/g;

if (shortStdYtUrlRegex.test(tabUrl)) {
result = tabUrl.replace(shortStdYtUrlReplaceRegex, '/tv#/watch/idle?v=');
}

else {
result = tabUrl.replace(shortTvYtUrlReplaceRegex, '/watch?v=');
}

// YouTube standard website video url
//https://www.youtube.com/watch?v=9tRDQK2MtRs
// YouTube TV url
//https://www.youtube.com/tv#/watch/video/idle?v=9tRDQK2MtRs
return result;
}

onInit = function () {

};

// Called when the user clicks on the browser action.
chromeApi.browserAction.onClicked.addListener(function(tab) {
var actionUrl = '';
var tabUrl = tab.url;

if (getCurrentPageVersion(tabUrl) !== undefined) {
actionUrl = getConvertedActionUrl(tabUrl);
if (actionUrl !== tabUrl) {
chromeApi.tabs.update(tab.id, {url: actionUrl});
}
}

});

chromeApi.tabs.onUpdated.addListener(function(tabId, changeInfo, tab){
if(!changeInfo.url) return; // URL did not change
// Might be better to analyze the URL to exclude things like anchor changes
var pageVersion = getCurrentPageVersion(tab.url);
if (pageVersion === undefined) return;

/* ... */
chromeApi.browserAction.setBadgeText({text: pageVersion.toUpperCase(), tabId: tab.id});
});

chromeApi.tabs.onCreated.addListener(function(tab){
var pageVersion = getCurrentPageVersion(tab.url);
if (pageVersion === undefined) return;

/* ... */
chromeApi.browserAction.setBadgeText({text: pageVersion.toUpperCase(), tabId: tab.id});
});

})(chrome);


If you pay attention, the core functionality happens on the chromeApi.browserAction.onClicked event, whenever you click the add-on/extension button.



The extension updates correctly between each YouTube version in Chrome, but in Firefox, this one redirects to YouTube TV once and never goes back to the desktop version no matter how many times you click on it.



But there's something weird in Firefox: browser history is updated correctly whenever the tab.update method is called, but it redirects to the TV version by itself again.



IMPORTANT: Both Firefox/Chrome extensions are using the currentTab permission, so it's not an extension issue by itself.



Extension on GitHub



UPDATE 2 (2018-11-25): I've updated the source code based on previous feedback







javascript firefox-addon






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 26 '18 at 1:51







adane1631

















asked Nov 25 '18 at 0:44









adane1631adane1631

113




113













  • Side question: Why are you using the pattern (function(chromeApi) {})(chrome);? I note that you are only using chromeApi.* in some places in your code, with an number of calls to chrome.* within the function.

    – Makyen
    Nov 25 '18 at 0:57











  • @Makyen I'll try to remove them first. I was having some badge update issues with Chrome, however It could be my fault in somewhere else in my code.

    – adane1631
    Nov 25 '18 at 1:01











  • Please show your actual code. Where is this block of code located? Is it located within something else that calls this block? Is it your background script? You have a comment that says // Called when the user clicks on the browser action. for this entire section, but you call chromeApi.browserAction.onClicked.addListener() with an anonymous function from within this code. Does that mean you're adding an additional listener each time the browserAction button is clicked? Or, is this the setup code for your only one browserAction onClicked listener?

    – Makyen
    Nov 25 '18 at 1:01











  • It's the setup for one onClicked listener addition (at least that what I actually expects to do) Also, comments in my code are a mess, so I'll try organize them as much as possible. And this is the actual code as well.

    – adane1631
    Nov 25 '18 at 1:13



















  • Side question: Why are you using the pattern (function(chromeApi) {})(chrome);? I note that you are only using chromeApi.* in some places in your code, with an number of calls to chrome.* within the function.

    – Makyen
    Nov 25 '18 at 0:57











  • @Makyen I'll try to remove them first. I was having some badge update issues with Chrome, however It could be my fault in somewhere else in my code.

    – adane1631
    Nov 25 '18 at 1:01











  • Please show your actual code. Where is this block of code located? Is it located within something else that calls this block? Is it your background script? You have a comment that says // Called when the user clicks on the browser action. for this entire section, but you call chromeApi.browserAction.onClicked.addListener() with an anonymous function from within this code. Does that mean you're adding an additional listener each time the browserAction button is clicked? Or, is this the setup code for your only one browserAction onClicked listener?

    – Makyen
    Nov 25 '18 at 1:01











  • It's the setup for one onClicked listener addition (at least that what I actually expects to do) Also, comments in my code are a mess, so I'll try organize them as much as possible. And this is the actual code as well.

    – adane1631
    Nov 25 '18 at 1:13

















Side question: Why are you using the pattern (function(chromeApi) {})(chrome);? I note that you are only using chromeApi.* in some places in your code, with an number of calls to chrome.* within the function.

– Makyen
Nov 25 '18 at 0:57





Side question: Why are you using the pattern (function(chromeApi) {})(chrome);? I note that you are only using chromeApi.* in some places in your code, with an number of calls to chrome.* within the function.

– Makyen
Nov 25 '18 at 0:57













@Makyen I'll try to remove them first. I was having some badge update issues with Chrome, however It could be my fault in somewhere else in my code.

– adane1631
Nov 25 '18 at 1:01





@Makyen I'll try to remove them first. I was having some badge update issues with Chrome, however It could be my fault in somewhere else in my code.

– adane1631
Nov 25 '18 at 1:01













Please show your actual code. Where is this block of code located? Is it located within something else that calls this block? Is it your background script? You have a comment that says // Called when the user clicks on the browser action. for this entire section, but you call chromeApi.browserAction.onClicked.addListener() with an anonymous function from within this code. Does that mean you're adding an additional listener each time the browserAction button is clicked? Or, is this the setup code for your only one browserAction onClicked listener?

– Makyen
Nov 25 '18 at 1:01





Please show your actual code. Where is this block of code located? Is it located within something else that calls this block? Is it your background script? You have a comment that says // Called when the user clicks on the browser action. for this entire section, but you call chromeApi.browserAction.onClicked.addListener() with an anonymous function from within this code. Does that mean you're adding an additional listener each time the browserAction button is clicked? Or, is this the setup code for your only one browserAction onClicked listener?

– Makyen
Nov 25 '18 at 1:01













It's the setup for one onClicked listener addition (at least that what I actually expects to do) Also, comments in my code are a mess, so I'll try organize them as much as possible. And this is the actual code as well.

– adane1631
Nov 25 '18 at 1:13





It's the setup for one onClicked listener addition (at least that what I actually expects to do) Also, comments in my code are a mess, so I'll try organize them as much as possible. And this is the actual code as well.

– adane1631
Nov 25 '18 at 1:13












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53463730%2ffirefox-addon-cannot-update-tab-url-using-web-extension%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53463730%2ffirefox-addon-cannot-update-tab-url-using-web-extension%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Lallio

Unable to find Lightning Node

Futebolista