Chrome extension setTimeout not working properly

13,170

I suspect the problem may with the automatic suspension of event pages after some period of inactivity. On my machine, onSuspend seems to called after ~10 seconds.

https://developer.chrome.com/extensions/event_pages#lifetime notes that

Once the event page has been idle a short time (a few seconds), the runtime.onSuspend event is dispatched. The event page has a few more seconds to handle this event before it is forcibly unloaded.

So, that may get you more around 13 seconds before the page is actually unloaded (giving you some cleanup time in onSuspend, I reckon). Then your page is unloaded and code initiated from there is no longer run.

https://developer.chrome.com/extensions/event_pages#transition says to use the alarms api for event pages instead of setTimeout.

Share:
13,170
badcom
Author by

badcom

Updated on June 05, 2022

Comments

  • badcom
    badcom almost 2 years

    My first post here =].

    I'm building a chrome extension and I'm using a setTimeout recursively. I noticed that if I set it to up to 13secs, it works, but if I set it to 14secs+ it won't work.

    This is an example which is on my background.js

    function start() {
    
        var timeout = setTimeout( function() { start(); }, 1000*15);
        alert('test');
    }
    
    chrome.webNavigation.onCompleted.addListener(function(o) {
    
        start();
    
        }, {
          url: [
            {urlContains: 'http://www.example.com/in.php'},
            {urlContains: 'http://www.example.com/out.php'}
          ]
        }
    );
    

    If you reduce that timeout to 1000*13, it works.

    This is my manifest.json

    {
      "name": "Extension",
      "version": "0.0.7",
      "manifest_version": 2,
      "description": "Keeps proxy session alive",
      "homepage_url": "http://www.example.com",
      "icons": {
        "16": "icons/icon16-on.png",
        "48": "icons/icon48-on.png",
        "128": "icons/icon128-on.png"
      },
      "default_locale": "en",
      "background": {
        "scripts": [
          "src/bg/background.js"
        ],
        "persistent": false
      },
      "browser_action": {
        "default_icon": "icons/icon19.png",
        "default_title": "Example - Off",
        "default_popup": ""
      },
     "permissions": [
        "webNavigation", 
        "*://*/*",
        "https://*/*"
      ]
    }
    

    Any idea on what could be causing this oddness? I'm testing this on developer mode, BTW.

    Thanks in advance!

    EDIT

    Code fixed:

    manifest.json

    I added "alarms" to the permissions

    background.js

    Added this event to listen to the alarms.create:

    chrome.alarms.onAlarm.addListener(function(alarm){
        start();
    });
    

    Replaced the setTimeout function with the below line

    chrome.alarms.create("Start", {periodInMinutes:1});
    

    Hope this helps!

  • badcom
    badcom over 9 years
    Yeah!! Spot on!! Well done! I'll vote up on this once I have enough reputation. Thanks a lot, man.