Chrome's developer tools can help you debug memory usage in your extension.
 Try the following:
(1) go to chrome://extensions
(2) click the "developer mode" link inn the upper right corner
(3) click the link to your background page that appeared under "Inspect
active views" next to your extension
(4) click the "Profiles" button the top toolbar of the web inspector
(5) Click on the "eye" icon in the lower left corner (the tooltip says "take
heap snapshot")

This will show you all of the memory that's in use.  If you take a second
heap snapshot, then you can compare the two of them relative to each other
to see what's changed since last time.

Erik


On Mon, Nov 9, 2009 at 3:59 PM, OwenCM <owencmo...@googlemail.com> wrote:

>
> Hi, I've written this script which loads up a page of facebook and
> then parses it to find the number of new notifications. This all works
> and the application works fine except there's a memory leak... I'm not
> particularly good at this kind of coding, this extension is a mashup
> of a few with some of my own code written in so you'll probably reach
> some WTF moments, feel free to point these out or make suggestions
> too :).
>
> Only odd thing you may wonder about is the failCount thing, every now
> and again the facebook page doesn't load properly or whatever, so it
> will attempt 3 loads, if it fails all 3 the icon is then updated to
> the fail icon, otherwise it remains normal until a problem is
> confirmed, not just a 1 off.
>
> Here's the code for my background.html page (I'm presuming it's fine
> just to post it here not just attach the file or anything?):
>
> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
>    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
> <html xmlns="http://www.w3.org/1999/xhtml";>
> <head>
> <script type="text/javascript">
>          var fbURL = "http://www.facebook.com/";;
>      var facebook = "http://www.facebook.com/help.php";; //used
> instead of home page to avoid awkward ajax
>      var pollInterval = 1000 * 15;  // 15 seconds
>      var requestTimeout = 1000 * 10;  // 10 seconds
>      var notificationCount;
>      var img_notLoggedInSrc = "not_logged_in";
>      var img_noNewSrc = "no-new";
>      var img_newSrc = "new";
>      var iconSet = "set1";
>      var iconFormat = ".gif";
>          var xhr;
>      var iconState;
>          var failCount = 2;
>
>
>      function initialize()
>      {
>        window.setTimeout(startRequest, 0);
>      }
>
>      function scheduleRequest() {
>        window.setTimeout(startRequest, pollInterval);
>      }
>
>      function startRequest() {
>        getNotificationCount(
>          function(count) {
>            updateNotificationCount(count);
>            scheduleRequest();
>          },
>          function() {
>            scheduleRequest();
>          }
>        );
>      }
>
>      var frame = null;
>      function setIcon(path) {
>        path = "icons/" + iconSet + "/" + path + iconFormat;
>        var img = new Image();
>        img.onerror = function() {
>            console.error("Could not load browser action icon '" +
> path + "'.");
>        }
>        img.onload = function() {
>            var canvas = document.createElement("canvas");
>            canvas.width = img.width > 19 ? 19 : img.width;
>            canvas.height = img.height > 19 ? 19 : img.height;
>
>            var canvas_context = canvas.getContext('2d');
>            canvas_context.clearRect(0, 0, canvas.width,
> canvas.height);
>            canvas_context.drawImage(img, 0, 0, canvas.width,
> canvas.height);
>            var imgData = canvas_context.getImageData(0, 0,
> canvas.width, canvas.height);
>            chrome.browserAction.setIcon({imageData: imgData});
>            delete imgData;
>        }
>        img.src = path;
>    }
>
>    function getNotificationCount(onSuccess, onError) {
>            if(xhr != null) {
>                        xhr.onreadystatechange = null;
>                        xhr = null;
>        }
>        xhr = new XMLHttpRequest();
>        var abortTimerId = window.setTimeout(function() {
>          xhr.abort();
>          onError();
>        }, requestTimeout);
>
>        function handleSuccess(count) {
>          window.clearTimeout(abortTimerId);
>          onSuccess(count);
>        }
>
>        function handleError() {
>                  failCount = failCount + 1;
>                  console.log("Failed, failcount is now " + failCount);
>                  if (failCount > 2) {
>                          setIcon(img_notLoggedInSrc);
>
>  chrome.browserAction.setBadgeBackgroundColor({color:[190, 190,
> 190, 255]});
>                          chrome.browserAction.setBadgeText({text:"X"});
>                          chrome.browserAction.setTitle({title:"Not logged
> in"});
>                          window.clearTimeout(abortTimerId);
>                          iconState = 3;
>                          failCount = 0;
>                          console.log("Swapped icon for fail. Reset
> failCount to 0");
>                  }
>                  onError();
>        }
>
>        try
>        {
>          xhr.onreadystatechange = function()
>          {
>            if (xhr.readyState == 4)
>            {
>              var notification_start = xhr.responseText.indexOf
> ('notifications_count');
>              console.log("ResponseText position is " +
> notification_start)
>              if(notification_start > 0)
>              {
>                var notification_end = xhr.responseText.indexOf
> ('titletip', notification_start);
>                var notifications = xhr.responseText.substring
> (notification_start,notification_end);
>
>                var count = getdigits(notifications);
>                if(count == "")
>                  count = 0;
>                handleSuccess(count);
>              }
>              else
>              {
>                handleError();
>              }
>                          xhr.onreadystatechange = null;
>               xhr = null;
>            }
>          }
>                  delete notification_start
>                  delete notification_end
>                  delete notifications
>        }
>        catch(e)
>        {
>          console.log(e);
>          handleError();
>        }
>
>        xhr.open("GET",facebook,true);
>        xhr.send(null);
>      }
>
>      function getdigits (s) {
>         return s.replace (/[^\d]/g, "");
>      }
>
>      function updateNotificationCount(count) {
>            failCount = 0;
>        if(notificationCount != count || iconState == 3)
>        {
>            console.log("Notifications have changed, resolving..")
>            if (count == 0) {
>                    console.log("You now have no notifications
> (updating icon)");
>                    setIcon(img_noNewSrc);
>                    chrome.browserAction.setBadgeBackgroundColor
> ({color:[120, 140, 180, 255]});
>                    chrome.browserAction.setTitle({title:"No new
> notifications"});
>                    chrome.browserAction.setBadgeText({text:""});
>                                        iconState = 0;
>                } else {
>                    setIcon(img_newSrc);
>                    notificationCount = count;
>                    console.log(count +" notifications found (updating
> icon)")
>                    chrome.browserAction.setBadgeBackgroundColor
> ({color:[120, 150, 215, 255]});
>                    chrome.browserAction.setBadgeText
> ({text:notificationCount});
>                                        iconState = 2;
>                }
>                        notificationCount = count;
>        }
>      }
>
>      function goToFacebook()
>      {
>            chrome.tabs.create({url: fbURL});
>      }
>
>        chrome.browserAction.onClicked.addListener(function(windowId) {
>                goToFacebook();
>        });
>
>      chrome.tabs.onUpdated.addListener(function(tabId, changeInfo) {
>            if (changeInfo.url && changeInfo.url.indexOf(facebook) ==
> 0) {
>                console.log("saw facebook! updating...");
>                updateNotificationsCount(count)
>            }
>        });
> </script>
> <title></title>
> </head>
> <body onload="initialize()">
> </body>
> </html>
>
> --~--~---------~--~----~------------~-------~--~----~
> You received this message because you are subscribed to the Google Groups
> "Chromium-extensions" group.
> To post to this group, send email to chromium-extensions@googlegroups.com
> To unsubscribe from this group, send email to
> chromium-extensions+unsubscr...@googlegroups.com<chromium-extensions%2bunsubscr...@googlegroups.com>
> For more options, visit this group at
> http://groups.google.com/group/chromium-extensions?hl=en
> -~----------~----~----~----~------~----~------~--~---
>
>

--

You received this message because you are subscribed to the Google Groups 
"Chromium-extensions" group.
To post to this group, send email to chromium-extensi...@googlegroups.com.
To unsubscribe from this group, send email to 
chromium-extensions+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/chromium-extensions?hl=.


Reply via email to