No need to modify *.spec file?

Regards,
Yin, Yan


> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of hmin
> Sent: Wednesday, October 13, 2010 3:08 PM
> To: [email protected]
> Subject: [meego-commits] 8350: Changes to
> MeeGo:1.1:Netbook:Testing/chrome-meego-extension
>
> Hi,
> I have made the following changes to chrome-meego-extension in project
> MeeGo:1.1:Netbook:Testing. Please review and accept ASAP.
>
> Thank You,
> hmin
>
> [This message was auto-generated]
>
> ---
>
> Request #8350:
>
>   submit:
> home:hmin:branches:MeeGo:1.1:Netbook:Testing/chrome-meego-extension(r
> 1)(cleanup) -> MeeGo:1.1:Netbook:Testing/chrome-meego-extension
>
>
> Message:
>     None
>
> State:   new          2010-10-13T00:07:48 hmin
> Comment: None
>
>
>
> changes files:
> --------------
> --- chrome-meego-extension.changes
> +++ chrome-meego-extension.changes
> @@ -0,0 +1,4 @@
> +* Sat Sep 25 2010 Hongbo Min <[email protected]> - 0.2.0
> +- Fix BMC#6940, BMC#6941, BMC#6932, BMC#6868 which causes the
> incorrect
> +  snapshot of web page.
> +
>
> spec files:
> -----------
>
> other changes:
> --------------
>
> ++++++ chrome-meego-extension-0.2.0.tar.bz2
> ---
> chrome-meego-extension-0.2.0/extension/chrome-meego-extension/backgrou
> nd.js
> +++
> chrome-meego-extension-0.2.0/extension/chrome-meego-extension/backgrou
> nd.js
> @@ -15,65 +15,121 @@
>   * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
>   */
>
> -var _debug = false;
> +var _debug = true;
> +
> +// Regular expression for extracting the root part from the given part
> +// Example: http://www.x.com/y/z  -> http://www.x.com/
> +var URLRegExp = new
> RegExp("^[A-Za-z]+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%\?\.=]+/?");
> +
> +// Store all tabs opening in browser
> +var currentTabs = {};
> +var favIcons = {};
> +var thumbnails = {};
> +var urls = {}
> +var thumbnailUpdateTime = {};
> +
> +// helper function for debug
>  function DBG(msg)
>  {
>       if(_debug) plugin.debug(msg);
>  }
>
> -var currentTabs = {};
> -var favIcons = {};
> -
>  function Tab(tabId, windowId) {
>    this.id = tabId;
>    this.windowId = windowId;
>    this.title = "";
>    this.url = "";
> -  this.thumbnail = null;
>    this.favIconUrl = "";
>    this.status = "";
>    this.update_thumbnail_time=0;
>  }
>
> -// url: setThumbnailTime
> -var setThumbnail = {};
> -const THUMBNAIL_UPDATE_INTERVAL = 3600 * 1000;
> +function URL(id, url)
> +{
> +     this.id = id;
> +     this.url = url;
> +     this.title = "";
> +     this.visitCount = 0;
> +     this.typedCount = 0;
> +     this.lastVisitTime = 0;
> +}
> +
> +// get the favIcon url for the given url
> +function getFaviconUrl(url)
> +{
> +     var favIconUrl = "";
> +     var result = URLRegExp.exec(url);
> +     if(result && result.length > 0)
> +     {
> +             favIconUrl = result[0];
> +             if(favIconUrl.charAt(favIconUrl.length-1) == '/')
> +                     favIconUrl += "favicon.ico";
> +             else favIconUrl += "/favicon.ico";
> +             if(!favIcons[favIconUrl])
> +             {
> +                     favIcons[favIconUrl] = "";
> +                     plugin.addFavIconItem(favIconUrl, Date.now(), "");
> +             }
> +     }
> +     return favIconUrl;
> +}
> +
> +// Get the favIcon data via http request
> +function getFavIconData(favIconUrl)
> +{
> +     if(!favIconUrl || favIconUrl=="" || (favIcons[favIconUrl]!=null &&
> favIcons[favIconUrl] != "")) return;
> +
> +     var request = new XMLHttpRequest();
> +     request.open("GET", favIconUrl, true);
> +     request.overrideMimeType("text/plain; charset=x-user-defined");
> +     request.onreadystatechange = function()
> +     {
> +             if(this.readyState == 3) {
> +                     // the response entity body is being received
> +                     if(favIcons[favIconUrl] != null && favIcons[favIconUrl] 
> != "")
> return;
> +                     var i = 0;
> +                     var icon_data="";
> +                     for(i = 0; i < this.responseText.length; i++)
> +
>       icon_data+=String.fromCharCode(this.responseText.charCodeAt(i) &
> 0xFF);
> +                     var base64 = btoa(icon_data);
> +                     plugin.addFavIconItem(favIconUrl, Date.now(), base64);
> +                     favIcons[favIconUrl] = base64;
> +             }
> +     }
> +     request.send(null);
> +}
>
>  function selectTabById(tabId) {
> -  DBG("selectTabById " + tabId);
>    if (tabId == -1)
>    {
> -    chrome.tabs.create({}, function (tab) {
> -             chrome.windows.update(tab.windowId, {focused: true});
> -          });
> +    chrome.tabs.create({}, NULL);
>      return;
>    }
>    chrome.tabs.update(tabId, {selected: true});
> -  chrome.windows.update(currentTabs[tabId].windowId, {focused: true});
> -}
> -
> -function openNewTabWithUrl(targetUrl) {
> -     DBG("open new tab");
> -     chrome.tabs.create({url:targetUrl, selected:true}, null);
> -}
> -
> -function restoreTabSelection(url) {
> -  selectTabByUrl(url);
> +  chrome.windows.update(currentTabs[tabId].windowId, {focused:true});
> +  takeScreenshot(tabId);
>  }
>
> -function selectTabByUrl(url) {
> +// Open a tab with the given target url
> +// If the url is already loaded in the browser, then the
> +// tab will be focused. Otherwise, create a new tab to
> +// load it
> +function selectTabByUrl(targetUrl) {
>    for (i in currentTabs) {
> -    if (currentTabs[i].url == url) {
> +    if (currentTabs[i].url == targetUrl) {
> +       chrome.windows.update(currentTabs[i].windowId, {focused:true});
>        chrome.tabs.update(currentTabs[i].id, {selected: true});
> -      chrome.windows.update(currentTabs[i].windowId, {focused: true});
> +       takeScreenshot(i);
> +       return;
>      }
>    }
> +  // creat a new tab open the target url
> +  chrome.tabs.create({url:targetUrl, selected:true}, null);
>  }
>
>  // when a new tab is created
>  chrome.tabs.onCreated.addListener(
>    function (tab) {
> -     DBG("## chrome.tabs.onCreated: id=" +tab.id+", url=" + tab.url);
>      if (!currentTabs[tab.id])
>        currentTabs[tab.id] = new Tab(tab.id, tab.windowId);
>        currentTabs[tab.id].url = tab.url;
> @@ -82,92 +138,89 @@
>         if(tab.url)
>         {
>               var title = tab.title ? tab.title : tab.url;
> -             plugin.addTabItem(tab.id, tab.windowId, tab.url, title);
> +             var favIconUrl = getFaviconUrl(tab.url);
> +             plugin.addTabItem(tab.id, tab.windowId, tab.url, title,
> favIconUrl?favIconUrl:"");
>         }
>    }
>  );
>
> -function takeScreenshot(tab)
> +// capture the thumbnail
> +function takeScreenshot(tabId)
>  {
> -     chrome.tabs.captureVisibleTab(tab.windowId, {format:"jpeg",
> quality:5},function(dataUrl){
> -                     currentTabs[tab.id].thumbnail = dataUrl;
> -                     currentTabs[tab.id].update_thumbnail_time = Date.now();
> -                     plugin.addThumbnailItem(tab.url, Date.now(), dataUrl);
> -
> -                     chrome.history.getVisits({'url': tab.url}, 
> function(visits) {
> -                             if(visits.length > 0) {
> -                             // Capture the thumbnail for URL typed by user
> -                                     var i = visits.length - 1; // Get the 
> most recent visit
> item
> -                                     if(visits[i].transition == 'typed') {
> -                                             
> if(!setThumbnail[currentTabs[tab.id].url] ||
> -                                                     Date.now() -
> setThumbnail[currentTabs[tab.id].url] > THUMBNAIL_UPDATE_INTERVAL){
> -
>       plugin.setPageThumbnail(currentTabs[tab.id].url, 
> currentTabs[tab.id].title,
> dataUrl);
> -                                                     
> setThumbnail[currentTabs[tab.id].url] =
> Date.now();
> -                                             }
> +     chrome.tabs.captureVisibleTab(currentTabs[tabId].windowId,
> {format:"jpeg", quality:5}, function(dataUrl){
> +                     var tab = currentTabs[tabId];
> +//            if(tab.status == "complete" &&
> +//                (!thumbnailUpdateTime[tab.url] ||
> +//                 Date.now() - thumbnailUpdateTime[tab.url] >
> 1800*1000))
> +                     if(tab.status == "complete")
> +                             chrome.history.getVisits({'url':tab.url}, 
> function(visits) {
> +                             // Capture the thumbnail for URL only typed by 
> user
> +                             for(i = 0; i < visits.length; i++)
> +                                     if(visits[i].transition == 'typed')
> +                                     {
> +                                             console.log("save thumbnail for 
> " + tab.url);
> +                                             thumbnailUpdateTime[tab.url] = 
> Date.now();
> +                                             
> plugin.setPageThumbnail(tab.url, tab.title,
> dataUrl);
> +                                             break;
>                                       }
> -                             }
> -                     });
> +                             });
> +
> +                     if(thumbnails[tab.url]!=null && thumbnails[tab.url] == 
> dataUrl)
> return;
> +                     thumbnails[tab.url] = dataUrl;
> +                     plugin.addThumbnailItem(tab.url, Date.now(), dataUrl);
> +
>       });
>  }
>
> -// Get the Icon data from http request
> -function getFavIconData(tab, favIconUrl)
> -{
> -     var request = new XMLHttpRequest();
> -     request.open("GET", favIconUrl, true);
> -     request.overrideMimeType("text/plain; charset=x-user-defined");
> -     request.onreadystatechange = function()
> -     {
> -             if(this.readyState == 3) {
> -                     // the response entity body is being received
> -                     var i = 0, icon_data="";
> -                     for(i = 0; i < this.responseText.length; i++)
> -
>       icon_data+=String.fromCharCode(this.responseText.charCodeAt(i) &
> 0xFF);
> -                     var base64 = btoa(icon_data);
> -                     plugin.addFavoriteIconItem(favIconUrl, Date.now(), 
> base64);
> -                     plugin.updateURLInfo(tab.url, tab.title, favIconUrl);
> -                     favIcons[favIconUrl] = base64;
> -             }
> -     }
> -     request.send(null);
> -}
>  // when a tab is updated
>  chrome.tabs.onUpdated.addListener(
>    function (tabId, changeInfo, tab) {
> -    var reg = new
> RegExp("^[A-Za-z]+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%\?\.=]+/");
> -     var rootUrl = reg.exec(tab.url);
> -     if(rootUrl)
> -     {
> -             favIconUrl = rootUrl+"favicon.ico";
> -             if(!favIcons[favIconUrl])getFavIconData(tab, favIconUrl);
> -             else plugin.updateURLInfo(tab.url, tab.title, favIconUrl);
> -     }
> +
> +     var favIconUrl = getFaviconUrl(tab.url);
> +     getFavIconData(favIconUrl);
> +
> +     if(!currentTabs[tab.id]) currentTabs[tab.id] = new Tab(tab.id,
> tab.windowId);
>
>       if(changeInfo.status == 'loading') {
> -             DBG("## chrome.tabs.onUpdated#loading: id="+tab.id+",
> url="+tab.url);
> -             if(!currentTabs[tab.id]) currentTabs[tab.id] = new Tab(tab.id,
> tab.windowId);
>               currentTabs[tab.id].status = "loading";
> -             plugin.addTabItem(tab.id, tab.windowId, tab.url, tab.title);
> +             currentTabs[tab.id].url = tab.url;
> +             currentTabs[tab.id].favIconUrl = favIconUrl;
> +             plugin.addTabItem(tab.id, tab.windowId, tab.url, tab.title,
> favIconUrl);
> +
> +        if(urls[tab.url] && tab.title != "")
> +            plugin.addURLItem(urls[tab.url].id, tab.url, tab.title, 
> favIconUrl,
> urls[tab.url].visitCount,
> +                          urls[tab.url].typedCount,
> urls[tab.url].lastVisitTime);
>       }
> +
>       if(changeInfo.status == 'complete') {
> -             DBG("## chrome.tabs.onUpdated#complete: id="+tab.id+", url=" +
> tab.url);
> +             currentTabs[tabId].url = tab.url;
>               currentTabs[tabId].title = tab.title;
> -     currentTabs[tabId].favIconUrl = tab.favIconUrl;
>               currentTabs[tabId].status = "complete";
> -
> -             if(tab.favIconUrl)
> +
> +             var iconUrl = favIconUrl;
> +             if(tab.favIconUrl && !favIcons[tab.favIconUrl])
>               {
> -                     if(!favIcons[tab.favIconUrl])getFavIconData(tab, 
> tab.favIconUrl);
> -                     else plugin.updateURLInfo(tab.url, tab.title,
> tab.favIconUrl?tab.favIconUrl:"");
> +                     iconUrl = tab.favIconUrl;
> +                     plugin.addFavIconItem(iconUrl, Date.now(), "");
> +                     getFavIconData(iconUrl);
>               }
>
> -             plugin.addTabItem(tab.id, tab.windowId, tab.url, tab.title);
> +             if(urls[tab.url] && tab.title != "")
> +             {
> +                     chrome.tabs.getSelected(currentTabs[tabId].windowId,
> function(atab)        {
> +                             if(atab.id == tabId) {
> +                                     takeScreenshot(tabId);
> +                             }
> +                     });
> +
> +                     plugin.addURLItem(urls[tab.url].id, tab.url, tab.title, 
> iconUrl,
> urls[tab.url].visitCount,
> +                                               urls[tab.url].typedCount,
> urls[tab.url].lastVisitTime);
> +                     delete urls[tab.url];
> +             }
>
> -             chrome.tabs.getSelected(currentTabs[tabId].windowId,
> function(atab)        {
> -                     if(atab.id == tabId) {
> -                             takeScreenshot(tab);
> -                     }
> -             });
> +             plugin.addTabItem(tab.id, tab.windowId, tab.url, tab.title, 
> iconUrl);
> +
> +
>       }
>    }
>  );
> @@ -175,7 +228,6 @@
>  //When a tab is attached to a window
>  chrome.tabs.onAttached.addListener(
>    function (tabId, attachInfo) {
> -     DBG("## chrome.tabs.onAttached: id="+attachInfo.newWindowId);
>      currentTabs[tabId].windowId = attachInfo.newWindowId;
>       plugin.updateWindowId(tabId, attachInfo.newWindowId);
>    }
> @@ -184,38 +236,63 @@
>  // When a tab is selected
>  chrome.tabs.onSelectionChanged.addListener(function (tabId) {
>    // capture the thumbnail each time the tab get selected
> -  DBG("## chrome.tabs.onSelectionChanged: id=" + tabId);
> -  chrome.tabs.captureVisibleTab(currentTabs[tabId].windowId,
> {format:"jpeg", quality:5},
> -       function (dataUrl) {
> -             currentTabs[tabId].thumbnail = dataUrl;
> -                      plugin.addThumbnailItem(currentTabs[tabId].url, 
> Date.now(),
> dataUrl);
> -      });
> +  takeScreenshot(tabId);
>  });
>
>  //When a tab is closed
>  chrome.tabs.onRemoved.addListener(
>    function (tabId) {
> -    DBG("## chrome.tabs.onRemoved: id="+tabId);
>      delete currentTabs[tabId];
>       plugin.removeTabItem(tabId);
>    }
>  );
>
>  //When a URL is visited
> +
> +// Why comment out the following code:
> +// It can not handle such a situation gracefully:
> +// when typing manually a url (baidu.com) into the url location bar,
> +// the browser will redirect it to http://www.baidu.com/. And the
> +// onVisited event is also emitted twice, one for baidu.com, another
> +// for http://www.baidu.com/. It seems to be tedious to  make the
> +// thumbnail for url (baidu.com) correct,
> +//
> +//chrome.history.onVisited.addListener(
> +//    function(item){
> +//        if(item.title == "") return;
> +//        chrome.history.getVisits({'url':item.url}, function(visits)
> +//            {
> +//                var last = visits.length - 1;
> +//
> +//                if(visits[last].transition == "typed" ||
> +//                    visits[last].transition == "link" ||
> +//                    visits[last].transition == "start_page" ||
> +//                    visits[last].transition == "auto_bookmark" ||
> +//                    visits[last].transition == "manual_subframe" ||
> +//                    visits[last].transition == "start_page" ||
> +//                    visits[last].transition == "reload")
> +//                {
> +//                    var favIconUrl = getFaviconUrl(item.url);
> +//                    getFavIconData(favIconUrl);
> +//                    plugin.addURLItem(item.id, item.url, item.title,
> favIconUrl, item.visitCount, item.typedCount, item.lastVisitTime);
> +//                }
> +//            });
> +//    }
> +//);
> +//
>  chrome.history.onVisited.addListener(
> -     function(item){
> -             chrome.history.getVisits({'url':item.url}, function(visits)
> -                     {
> -                             var last = visits.length - 1;
> -                             if(visits[last].transition == "typed" ||
> -                                     visits[last].transition == "link" ||
> -                                     visits[last].transition == "start_page" 
> ||
> -                                     visits[last].transition == "generated" 
> ||
> -                                     visits[last].transition == 
> "auto_bookmark" ||
> -                                     visits[last].transition == "reload")
> -                                     plugin.addURLItem(item.id, item.url, 
> item.title,
> item.visitCount, item.typedCount, item.lastVisitTime, 0);
> -                     });
> -     }
> +             function(item) {
> +                     var url;
> +
> +                     if(urls[item.url]) url = urls[item.url];
> +                     else url = new URL(item.id, item.url);
> +
> +                     url.title = item.title;
> +                     url.visitCount = item.visitCount;
> +                     url.typedCount = item.typedCount;
> +                     url.lastVisitTime = item.lastVisitTime;
> +                     urls[item.url] = url;
> +             }
>  );
>
>  //When a history is removed
> @@ -224,6 +301,7 @@
>               if(removeInfo.allHistory)
>               {
>                       plugin.clearAllURLs();
> +                     urls = {};
>               }
>               else
>               {
> @@ -231,6 +309,7 @@
>                       for(i = 0; i < removeInfo.urls.length; i++)
>                       {
>                               plugin.removeURLItem(removeInfo.urls[i]);
> +                             delete urls[removeInfo.urls[i]];
>                       }
>               }
>       }
> @@ -239,7 +318,8 @@
>  //When a new bookmark is created
>  chrome.bookmarks.onCreated.addListener(
>       function(id, node){
> -             plugin.addBookmarkItem(id, node.url, node.title, 
> node.dateAdded);
> +             var favIconUrl = getFaviconUrl(node.url);
> +             plugin.addBookmarkItem(id, node.url, node.title, favIconUrl,
> node.dateAdded);
>       }
>  );
>
> @@ -255,7 +335,8 @@
>       var i;
>       if(bookmark.children == null)
>       {
> -             plugin.addBookmarkItem(bookmark.id, bookmark.url, 
> bookmark.title,
> bookmark.dateAdded);
> +             var favIconUrl = getFaviconUrl(bookmark.url);
> +             plugin.addBookmarkItem(bookmark.id, bookmark.url, 
> bookmark.title,
> favIconUrl, bookmark.dateAdded);
>       }
>       else
>       {
> @@ -267,26 +348,26 @@
>  function init() {
>
>    DBG("Initialize MeeGo extension....");
> -
>    chrome.windows.getAll({populate: true}, function (windows) {
> -      var found = false;
> +         var found = false;
>               // Get the URL from web panel
>               var selected_url = plugin.fetchUrlFromPanel();
> -             plugin.clearAllTabItems();
> +             DBG("fetch url from panel: " + selected_url);
> +             plugin.clearAllTabItems();
>               windows.forEach(function (win) {
>             window.focus();
>             win.tabs.forEach(function (tab) {
>                               if(tab.url == selected_url){
> -                                     DBG("restore " + selected_url);
>                                       chrome.tabs.update(tab.id, {selected: 
> true});
> -                                     chrome.windows.update(tab.windowId, 
> {focused:
> true});
>                               found = true;
>                               }
>                               currentTabs[tab.id] = new Tab(tab.id, 
> tab.windowId);
>                  currentTabs[tab.id].title = tab.title;
> -                currentTabs[tab.id].favIconUrl = tab.favIconUrl;
> +                             favIconUrl = tab.favIconUrl ? tab.favIconUrl :
> getFaviconUrl(tab.url);
> +                currentTabs[tab.id].favIconUrl = favIconUrl;
>                  currentTabs[tab.id].url = tab.url;
> -                             plugin.addTabItem(tab.id, tab.windowId, 
> tab.url, tab.title);
> +                             currentTabs[tab.id].status = "loading";
> +                             plugin.addTabItem(tab.id, tab.windowId, 
> tab.url?tab.url:"",
> tab.title?tab.title:"", favIconUrl);
>
>              });
>          });
> --- chrome-meego-extension-0.2.0/plugin/src/MeeGoPluginAPI.cpp
> +++ chrome-meego-extension-0.2.0/plugin/src/MeeGoPluginAPI.cpp
> @@ -18,13 +18,15 @@
>  #include <sys/types.h>
>  #include <sys/stat.h>
>  #include <errno.h>
> -
> +#include <string.h>
>  #include "BrowserObjectAPI.h"
>  #include "variant_list.h"
>  #include "DOM/JSAPI_DOMDocument.h"
>  #include "DOM/JSAPI_DOMWindow.h"
>  #include "MeeGoPluginAPI.h"
>
> +#define EXTENSION_DEBUG
> +
>  #ifdef EXTENSION_DEBUG
>  #include <stdarg.h>
>  #define DBG(...) g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
> __VA_ARGS__)
> @@ -40,13 +42,13 @@
>
>  MeeGoPluginAPI::MeeGoPluginAPI(FB::BrowserHostWrapper *host) :
> m_host(host), m_input_file(NULL), m_input(NULL)
>  {
> -     DBG("===> MeeGoPluginAPI::ctor()");
>       registerMethod("debug",  make_method(this,
> &MeeGoPluginAPI::debug));
>       registerMethod("setPageThumbnail", make_method(this,
> &MeeGoPluginAPI::setPageThumbnail));
> -     registerMethod("addURLItem", make_method(this,
> &MeeGoPluginAPI::addURLItem));
>       registerMethod("updateURLInfo", make_method(this,
> &MeeGoPluginAPI::updateURLInfo));
> +
> +     registerMethod("addURLItem", make_method(this,
> &MeeGoPluginAPI::addURLItem));
>       registerMethod("addBookmarkItem", make_method(this,
> &MeeGoPluginAPI::addBookmarkItem));
> -     registerMethod("addFavoriteIconItem", make_method(this,
> &MeeGoPluginAPI::addFavoriteIconItem));
> +     registerMethod("addFavIconItem", make_method(this,
> &MeeGoPluginAPI::addFavIconItem));
>       registerMethod("addThumbnailItem", make_method(this,
> &MeeGoPluginAPI::addThumbnailItem));
>       registerMethod("updateWindowId", make_method(this,
> &MeeGoPluginAPI::updateWindowId));
>       registerMethod("addTabItem", make_method(this,
> &MeeGoPluginAPI::addTabItem));
> @@ -65,8 +67,6 @@
>
>  MeeGoPluginAPI::~MeeGoPluginAPI()
>  {
> -     DBG("==> MeeGoPluginAPI::~MeeGoPluginAPI");
> -
>       closePipe();
>       sqlite3_close(m_panel_db);
>       g_free(m_db_dirname);
> @@ -78,7 +78,6 @@
>  {
>       std::string s;
>       s = msg.convert_cast<std::string>();
> -
>       DBG("%s", s.c_str());
>       return msg;
>  }
> @@ -90,10 +89,6 @@
>       memset(img, 0, len);
>       memcpy(img, thumbnail.data() + 22, len);
>
> -#ifdef EXTENSION_DEBUG
> -     g_debug("setPageThumbnail for %s %s", url.c_str(), title.c_str());
> -#endif
> -
>       // update thumbnail
>       gchar *thumbnail_path;
>       gchar *thumbnail_filename = NULL;
> @@ -143,8 +138,8 @@
>       }
>       else
>       {
> -             data.app_name = (gchar*)"chromium";
> -             data.app_exec = (gchar*)"chromium \"%u\"";
> +             data.app_name = (gchar*)"chromium-browser";
> +             data.app_exec = (gchar*)"chromium-browser \"%u\"";
>       }
>       data.is_private = FALSE;
>       data.groups = NULL;
> @@ -190,8 +185,6 @@
>       GError *error = NULL;
>       gboolean result = TRUE;
>
> -     DBG("input_io_func: handle %d condition", condition);
> -
>       while (condition & (G_IO_PRI | G_IO_IN))
>       {
>               GIOStatus status;
> @@ -252,7 +245,6 @@
>
>  void MeeGoPluginAPI::processCommand(guint command)
>  {
> -     DBG("processCommand %d\n", command);
>       switch (command) {
>               case CMD_SELECT_TAB:
>                       {
> @@ -262,7 +254,9 @@
>
>                                       status = pipe_receive (m_input, 
> G_TYPE_INT, &tab_id,
>                                                       G_TYPE_INVALID);
> -                                     DBG("Restore tab %d", tab_id);
> +
> +                                     DBG("select tab id: %d", tab_id);
> +
>                                       //              
> FireEvent("onReceivedSelectTabCmd",
> FB::variant_list_of(tab_id));
>
>       m_host->getDOMWindow().callMethod<void>("selectTabById",
> FB::variant_list_of(tab_id));
>
> @@ -275,7 +269,6 @@
>                       }
>               case CMD_NEW_TAB:
>                       {
> -                             DBG("handle CMD_NEW_TAB command");
>                               try
>                               {
>                                       char* buffer = NULL;
> @@ -283,7 +276,7 @@
>                                       std::string url;
>                                       status = pipe_receive(m_input, 
> G_TYPE_STRING,
> &buffer, G_TYPE_INVALID);
>                                       url = buffer;
> -
>       m_host->getDOMWindow().callMethod<void>("openNewTabWithUrl",
> FB::variant_list_of(url));
> +
>       m_host->getDOMWindow().callMethod<void>("selectTabByUrl",
> FB::variant_list_of(url));
>                                       g_free(buffer);
>                               }catch(...){
>                                       g_warning("exception for invoke 
> javascript method");
> @@ -303,15 +296,12 @@
>
>       GIOStatus status;
>
> -     DBG("pipe_receive ...");
>       va_start (args, channel);
>
>       while ((type = va_arg (args, GType)) != G_TYPE_INVALID)
>       {
>               gsize size;
>
> -             DBG("type = %d", type);
> -
>               gchar *buffer = (gchar*)va_arg (args, gpointer);
>               GError *error = NULL;
>
> @@ -354,7 +344,6 @@
>               {
>                       do
>                       {
> -                             DBG("#read chars from channel ...");
>                               status = g_io_channel_read_chars (channel,
>                                               (gchar *)(&size),
>                                               sizeof (size),
> @@ -368,7 +357,6 @@
>
>                               do
>                               {
> -                                     DBG("@read chars from channel ...");
>                                       status = g_io_channel_read_chars 
> (channel,
>                                                       *((gchar **)buffer),
>                                                       size,
> @@ -380,7 +368,6 @@
>               }
>               else do
>               {
> -                     DBG("$read chars from chanel ...");
>                       status = g_io_channel_read_chars (channel,
>                                       buffer,
>                                       size,
> @@ -439,9 +426,6 @@
>       }
>       g_remove(m_input_file);
>       g_free(m_input_file);
> -#ifdef EXTENSION_DEBUG
> -     g_debug("MeeGo plugin closePipe\n");
> -#endif
>  }
>
>  void MeeGoPluginAPI::createPipe()
> @@ -457,7 +441,6 @@
>
>       g_assert(m_input_file);
>
> -     DBG("MeeGo plugin openPipe: %s", m_input_file);
>       fd = open (m_input_file, O_RDONLY | O_NONBLOCK);
>       m_input = g_io_channel_unix_new (fd);
>       g_io_channel_set_encoding (m_input, NULL, NULL);
> @@ -467,7 +450,6 @@
>                       (GIOCondition) (G_IO_IN | G_IO_ERROR | G_IO_HUP),
>                       (GIOFunc)input_io_func,
>                       this);
> -     DBG("pipe %s opened", m_input_file);
>  }
>
>  std::string MeeGoPluginAPI::fetchUrlFromPanel()
> @@ -478,8 +460,6 @@
>       gchar *command;
>       gsize length;
>
> -     DBG("doStartupCmd");
> -
>       if (g_file_test (plugin_cmd, G_FILE_TEST_EXISTS))
>       {
>               g_file_get_contents (plugin_cmd, (gchar **)&command, &length,
> NULL);
> @@ -506,19 +486,17 @@
>       (id INTEGER PRIMARY KEY, url LONGCHARVAR, last_update_time
> INTEGER NOT NULL, image_data BLOB)"
>
>  #define CREATE_TABS_TABLE_STMT "CREATE TABLE IF NOT EXISTS
> current_tabs \
> -     (id INTEGER PRIMARY KEY, tab_id INTEGER, win_id INTEGER, url
> LONGVARCHAR, title LONGVARCHAR)"
> +     (tab_id INTEGER PRIMARY KEY, win_id INTEGER, url LONGVARCHAR, title
> LONGVARCHAR, \
> +      favicon_id INTEGER DEFAULT 0)"
>
>  #define CREATE_ICON_TABLE_STMT "CREATE TABLE IF NOT EXISTS favicons \
> -     (id INTEGER PRIMARY KEY, url LONGVARCHAR, last_update_time
> INTEGER, \
> -      icon_data BLOB)"
> +     (id INTEGER PRIMARY KEY, url LONGVARCHAR, last_update_time
> INTEGER)"
>
>  void MeeGoPluginAPI::init_db()
>  {
>       int rc;
>       gchar* db_path = NULL;
>
> -     DBG("init panel database()");
> -
>       db_path = g_build_filename(g_get_home_dir(),
>                       ".config",
>                       NETPANEL_DIRNAME,
> @@ -565,7 +543,7 @@
>       }
>       else
>       {
> -             DBG("failed to open %s: %s", db_path,
> sqlite3_errmsg(m_panel_db));
> +             g_warning("failed to open %s: %s", db_path,
> sqlite3_errmsg(m_panel_db));
>               sqlite3_close(m_panel_db);
>               m_panel_db = NULL;
>       }
> @@ -580,13 +558,10 @@
>
>
>  // Insert a URL item into urls table
> -void MeeGoPluginAPI::addURLItem(std::string id, std::string url, std::string
> title,
> -             FB::variant visit_count, FB::variant typed_count, FB::variant
> last_visit_time,
> -             std::string favicon_url)
> +void MeeGoPluginAPI::addURLItem(std::string id, std::string url, std::string
> title, std::string favicon_url,
> +             FB::variant visit_count, FB::variant typed_count, FB::variant
> last_visit_time)
>  {
> -     int rc;
> -     char* select_sql, *insert_sql, *update_sql;
> -     sqlite3_stmt *select_stmt;
> +     char* insert_sql;
>       int visit_count_, typed_count_;
>       long long id_, last_visit_time_;
>
> @@ -599,86 +574,20 @@
>
>       if(!m_panel_db) return;
>
> -     select_sql = insert_sql = update_sql = NULL;
> -     select_stmt = NULL;
> -
> -     DBG("MeeGoPluginAPI::insertURLItem('%s')",  url.c_str());
> -
> -     // Check whether the item has been already existing in table
> -     select_sql = g_strdup_printf("SELECT id FROM urls WHERE id=%d", id_);
> -     sqlite3_prepare_v2(m_panel_db, select_sql, -1, &select_stmt, NULL);
> -     rc = sqlite3_step(select_stmt);
> -     sqlite3_finalize(select_stmt);
> -
> -     int favicon_id = 0; //FIXME: determine the id for favorite icon from 
> its url
> -     if(rc == SQLITE_DONE) // No item found, insert new record into table
> -     {
> -             insert_sql = g_strdup_printf("INSERT INTO urls(id, url, title,
> visit_count, typed_count, last_visit_time, favicon_id) \
> -                             VALUES(%lld, \"%s\", \"%s\", %d, %d, %lld, 
> %d)", id_,
> url.c_str(), title.c_str(), visit_count_, typed_count_,
> -                             last_visit_time_, favicon_id);
> -
> -             char* errmsg = NULL;
> -             if(SQLITE_OK != sqlite3_exec(m_panel_db, insert_sql, NULL, NULL,
> &errmsg))
> -             {
> -                     DBG("failed to exec %s: %s", update_sql, errmsg);
> -                     g_free(errmsg);
> -             }
> -             g_free(insert_sql);
> -     }
> -
> -     else if(rc == SQLITE_ROW) // Already exists and update the item
> -     {
> -             update_sql =  g_strdup_printf("UPDATE urls SET url=\"%s\",
> title=\"%s\", visit_count=%d, typed_count=%d,"
> -                             "last_visit_time=%lld, favicon_id=%d WHERE 
> id=%lld",
> url.c_str(), title.c_str(), visit_count_,
> -                             typed_count_,last_visit_time_, favicon_id, id_);
> -
> -             char* errmsg = NULL;
> -             if(SQLITE_OK != sqlite3_exec(m_panel_db, update_sql, NULL, NULL,
> &errmsg))
> -             {
> -                     DBG("failed to exec %s: %s", update_sql, errmsg);
> -             }
> -             g_free(errmsg);
> -             g_free(update_sql);
> -     }
> -
> -     else
> -     {
> -             DBG("failed to exec '%s': %s", select_sql,
> sqlite3_errmsg(m_panel_db));
> -     }
> -
> -     g_free(select_sql);
> -
> -     return;
> -}
> +     insert_sql = g_strdup_printf(
> +                             "INSERT OR REPLACE INTO urls(id, url, title, 
> visit_count,
> typed_count, last_visit_time, favicon_id) "
> +                             "VALUES(%lld, '%s', '%s', %d, %d, %lld, (SELECT
> COALESCE((SELECT id FROM favicons WHERE url='%s'), 0)))",
> +                             id_, url.c_str(), title.c_str(), visit_count_, 
> typed_count_,
> last_visit_time_, favicon_url.c_str());
>
> -void MeeGoPluginAPI::updateURLInfo(std::string url, std::string title,
> std::string favicon_url)
> -{
> -     int rc;
>       char* errmsg = NULL;
> -
> -     if(!m_panel_db) return;
> -
> -     DBG("MeeGoPluginAPI::updateURLInfo: %s", url.c_str());
> -
> -     char* sql = g_strdup_printf("UPDATE urls SET
> title='%s',favicon_id=(SELECT id FROM favicons WHERE url='%s') WHERE
> url='%s'", title.c_str(), favicon_url.c_str(), url.c_str());
> -
> -     rc = sqlite3_exec(m_panel_db, sql, NULL, NULL, &errmsg);
> -     if(rc != SQLITE_OK)
> -     {
> -             DBG("failed to exec '%s': %s", sql, errmsg);
> -             g_free(errmsg);
> -     }
> -     g_free(sql);
> -
> -     sql = g_strdup_printf("UPDATE bookmarks SET favicon_id=(SELECT id
> FROM favicons WHERE url='%s') WHERE url='%s'", favicon_url.c_str(),
> url.c_str());
> -     rc = sqlite3_exec(m_panel_db, sql, NULL, NULL, &errmsg);
> -     if(rc != SQLITE_OK)
> +     if(SQLITE_OK != sqlite3_exec(m_panel_db, insert_sql, NULL, NULL,
> &errmsg))
>       {
> -             DBG("failed to exec '%s': %s", sql, errmsg);
> +             g_warning("failed to exec:  %s", errmsg);
>               g_free(errmsg);
>       }
> -     g_free(sql);
> +     g_free(insert_sql);
>
> +     return;
>  }
>
>  void MeeGoPluginAPI::clearAllURLs()
> @@ -686,7 +595,6 @@
>       char* errmsg = NULL;
>       if(!m_panel_db) return;
>
> -     DBG("MeeGoPluginAPI::clearAllURLs");
>       // Remove thumbnails
>       char* thumbnail_dirname = g_build_filename(m_db_dirname,
> "thumbnails", NULL);
>
> @@ -712,13 +620,15 @@
>
>       if(sqlite3_exec(m_panel_db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
>       {
> -             DBG("failed to exec %s: %s", sql, errmsg);
> +             g_warning("failed to exec %s: %s", sql, errmsg);
>               g_free(errmsg);
>       }
>  }
>
>  // Insert a bookmark item into bookmarks table
> -void MeeGoPluginAPI::addBookmarkItem(std::string id, std::string url,
> std::string title, FB::variant dateAdded)
> +void MeeGoPluginAPI::addBookmarkItem(std::string id, std::string url,
> +                                          std::string title, std::string
> faviconUrl,
> +                                                                      
> FB::variant dateAdded)
>  {
>       int rc;
>       sqlite3_stmt* select_stmt = NULL;
> @@ -729,116 +639,116 @@
>
>       if(!m_panel_db) return;
>
> -     DBG("MeeGoPluginAPI::insertBookmarkItem");
> -
>       dateAdded_ = static_cast<long
> long>(dateAdded.convert_cast<double>());
> -
>       id_ = g_ascii_strtoll(id.c_str(), NULL, 10);
> -     favicon_id = 0; //FIXME: determine the id for favorite icon
>
> -     // Check whether the item already exists
> -     select_sql = g_strdup_printf("SELECT id from bookmarks WHERE id=%lld
> LIMIT 1", id_);
> -     sqlite3_prepare_v2(m_panel_db, select_sql, -1, &select_stmt, NULL);
> -     rc = sqlite3_step(select_stmt);
> +     insert_sql = g_strdup_printf(
> +                     "INSERT OR REPLACE INTO bookmarks(id, url, title, 
> dateAdded,
> favicon_id) "
> +                     "VALUES(%lld, '%s', '%s', %lld, (SELECT 
> COALESCE((SELECT id
> FROM favicons WHERE url='%s'), 0)))",
> +                     id_, url.c_str(), title.c_str(), dateAdded_, 
> faviconUrl.c_str());
>
> -     if(rc == SQLITE_DONE) // Not found, add the new item
> +     if(SQLITE_OK != sqlite3_exec(m_panel_db, insert_sql, NULL, NULL,
> &errmsg))
>       {
> -             insert_sql = g_strdup_printf("INSERT INTO bookmarks(id, url, 
> title,
> dateAdded) \
> -                             VALUES(%lld, \"%s\", \"%s\", %lld)", id_, 
> url.c_str(),
> title.c_str(), dateAdded_);
> -
> -             errmsg = NULL;
> -             if(SQLITE_OK != sqlite3_exec(m_panel_db, insert_sql, NULL, NULL,
> &errmsg))
> -             {
> -                     DBG("failed to exec %s: %s", insert_sql, errmsg);
> -                     g_free(errmsg);
> -             }
> -             g_free(insert_sql);
> +             g_warning("failed to exec %s: %s", insert_sql, errmsg);
> +             g_free(errmsg);
>       }
> -     else if(rc == SQLITE_ROW) //Found the item, update it
> +     g_free(insert_sql);
> +
> +}
> +void MeeGoPluginAPI::updateURLInfo(std::string url, std::string title,
> std::string favicon_url)
> +{
> +     int rc;
> +     char* errmsg = NULL;
> +
> +     if(!m_panel_db) return;
> +
> +     char* sql = g_strdup_printf("UPDATE urls SET
> title='%s',favicon_id=(SELECT id FROM favicons WHERE url='%s') WHERE
> url='%s'", title.c_str(), favicon_url.c_str(), url.c_str());
> +
> +     if(SQLITE_OK != sqlite3_exec(m_panel_db, sql, NULL, NULL, &errmsg))
>       {
> -             update_sql = g_strdup_printf("UPDATE bookmarks SET url=\"%s\",
> title=\"%s\", favicon_id=(SELECT favicon_id FROM urls WHERE url='%s') WHERE
> id=%lld",
> -                             url.c_str(), title.c_str(), url.c_str(), id_);
> -             errmsg = NULL;
> -             if(SQLITE_OK != sqlite3_exec(m_panel_db, update_sql, NULL, NULL,
> &errmsg))
> -             {
> -                     DBG("failed to exec %s: %s", update_sql, errmsg);
> -                     g_free(errmsg);
> -             }
> -             g_free(update_sql);
> +             g_warning("failed to exec:  %s", errmsg);
> +             g_free(errmsg);
>       }
> -     else
> +     g_free(sql);
> +
> +     sql = g_strdup_printf("UPDATE bookmarks SET favicon_id=(SELECT id
> FROM favicons WHERE url='%s') WHERE url='%s'", favicon_url.c_str(),
> url.c_str());
> +     rc = sqlite3_exec(m_panel_db, sql, NULL, NULL, &errmsg);
> +     if(rc != SQLITE_OK)
>       {
> -             DBG("failed to exec '%s'", select_sql);
> +             g_warning("failed to exec '%s': %s", sql, errmsg);
> +             g_free(errmsg);
>       }
> +     g_free(sql);
>
> -     sqlite3_finalize(select_stmt);
> -     g_free(select_sql);
> +     return;
>  }
>
>  // Insert a favorite icon item into favicons table
> -void MeeGoPluginAPI::addFavoriteIconItem(std::string url, FB::variant
> last_update, FB::variant data )
> +void MeeGoPluginAPI::addFavIconItem(std::string url, FB::variant last_update,
> FB::variant data)
>  {
>       int rc;
> +     int id;
>       long long last_update_;
> -     char* select_sql, *sql = NULL;
> +     char* select_sql = NULL;
> +     char* sql = NULL;
>       sqlite3_stmt* select_stmt = NULL;
> -
> +
>       if(!m_panel_db) return;
> -
> -     last_update_ = static_cast<long
> long>(last_update.convert_cast<double>());
>
> -     DBG("MeeGoPluginAPI::insertFavoriteIconItem(url=\"%s\",
> last_update_time=%lld)", url.c_str(), last_update_);
> +     last_update_ = static_cast<long
> long>(last_update.convert_cast<double>());
>
> -     std::string base64_string = data.convert_cast<std::string>();
> +     select_sql = g_strdup_printf("SELECT id FROM favicons WHERE url='%s'",
> url.c_str());
> +     sqlite3_prepare_v2(m_panel_db, select_sql, -1, &select_stmt, NULL);
> +     if(sqlite3_step(select_stmt) == SQLITE_ROW) // Already exists
> +     {
> +             sql = g_strdup_printf("UPDATE favicons SET last_update_time=%lld
> WHERE url='%s'", last_update_, url.c_str());
> +     }
> +     else
> +     {
> +             sql = g_strdup_printf("INSERT INTO favicons(url, 
> last_update_time)
> VALUES('%s', %lld)", url.c_str(), last_update_);
> +     }
> +     sqlite3_finalize(select_stmt);
> +     g_free(select_sql);
>
> -     select_sql = g_strdup_printf("SELECT id FROM favicons WHERE url='%s'
> LIMIT 1", url.c_str());
> -     sqlite3_prepare_v2(m_panel_db, select_sql, -1, &select_stmt, NULL);
> -     rc = sqlite3_step(select_stmt);
>
> -     if(rc != SQLITE_DONE && rc != SQLITE_ROW)
> +     // Execute SQL statement
> +     char* errmsg = NULL;
> +     if(sqlite3_exec(m_panel_db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
>       {
> -             DBG("failed to exec %s: %s", select_sql,
> sqlite3_errmsg(m_panel_db));
> -             g_free(select_sql);
> -             return;
> +             g_warning("failed to exec: %s", errmsg);
> +             g_free(errmsg);
>       }
> +     g_free(sql);
> +
> +     std::string base64_string = data.convert_cast<std::string>();
> +     if(base64_string == "") return;
>
>       // Build icon filename from url
>       char* csum = g_compute_checksum_for_string (G_CHECKSUM_MD5,
> url.c_str(), -1);
>       char* filename = g_strconcat(csum, ".ico", NULL);
>
> -     if(rc == SQLITE_DONE) // Not found
> -     {
> -             sql = g_strdup_printf("INSERT INTO favicons(url, 
> last_update_time,
> icon_data) VALUES('%s', %lld, '%s')",
> -                             url.c_str(), last_update_, filename);
> -     }
> -     if(rc == SQLITE_ROW) // Found
> -     {
> -             sql = g_strdup_printf("UPDATE favicons SET
> last_update_time=%lld,icon_data='%s' WHERE url='%s'",
> -                             last_update_, filename, url.c_str());
> -     }
> +     // Save the icon data into local .ico file
> +     size_t len = 0;
> +     GError* error = NULL;
> +     char* icon_filename = NULL;
> +     char* icon_data = NULL;
> +
> +     icon_data = (char*)g_base64_decode(base64_string.c_str(), &len);
>
> -     char* errmsg = NULL;
> -     if(sql != NULL && (SQLITE_OK == sqlite3_exec(m_panel_db, sql, NULL,
> NULL, &errmsg)))
> -     {
> -             size_t len = 0;
> -             char* icon_data = (char*)g_base64_decode(base64_string.c_str(),
> &len);
> +     // avoid bad-formed icon data
> +     if(strstr(icon_data, "<HTML>") || strstr(icon_data, "<html>")) goto end;
>
> -             GError* error = NULL;
> -             char* icon_filename = g_build_filename(m_db_dirname, "favicons",
> filename, NULL);
> -             if(!g_file_set_contents(icon_filename, icon_data, len, &error))
> -             {
> -                     DBG("failed to g_file_set_contents: %s", 
> error->message);
> -                     g_error_free(error);
> -             }
> -             g_free(sql);
> -             g_free(icon_data);
> -             g_free(icon_filename);
> -     }
> -     else
> +     icon_filename = g_build_filename(m_db_dirname, "favicons", filename,
> NULL);
> +     if(!g_file_set_contents(icon_filename, icon_data, len, &error))
>       {
> -             DBG("Oops .... %s", errmsg ? errmsg : "null");
> +             g_warning("failed to g_file_set_contents: %s", error->message);
> +             g_error_free(error);
>       }
> -     g_free(select_sql);
> +
> +end:
> +     g_free(icon_data);
> +     g_free(icon_filename);
> +
>       return;
>  }
>
> @@ -848,8 +758,6 @@
>  {
>       if(!m_panel_db) return;
>
> -     DBG("MeeGoPluginAPI::insertThumbnailItem");
> -
>       // Build filename for thumbnail
>       char* csum = g_compute_checksum_for_string (G_CHECKSUM_MD5,
> url.c_str(), -1);
>       char* filename = g_strconcat(csum, ".png", NULL);
> @@ -861,7 +769,7 @@
>       char* thumbnail_filename = g_build_filename(m_db_dirname,
> "thumbnails", filename, NULL);
>       if(!g_file_set_contents(thumbnail_filename, blob, len, &error))
>       {
> -             DBG("failed to g_file_set_contents: %s", error->message);
> +             g_warning("failed to g_file_set_contents: %s", error->message);
>               g_error_free(error);
>       }
>       g_free(blob);
> @@ -871,13 +779,12 @@
>       g_free(csum);
>       g_free(filename);
>
> -     DBG("end of addThumbnailItem");
> -
>       return;
>  }
>
>  // Insert a tab item FB:varianto current_tabs table
> -void MeeGoPluginAPI::addTabItem(FB::variant tab_id, FB::variant win_id,
> std::string url, std::string title)
> +void MeeGoPluginAPI::addTabItem(FB::variant tab_id, FB::variant win_id,
> std::string url,
> +                                     std::string title, std::string 
> faviconUrl)
>  {
>       int rc;
>       int tab_id_, win_id_;
> @@ -889,46 +796,19 @@
>       tab_id_ = tab_id.convert_cast<int>();
>       win_id_ = win_id.convert_cast<int>();
>
> -     DBG("MeeGoPluginAPI::insertTabItem(tab_id=%d, win_id=%d, url=%s,
> title=%s)",
> -                     tab_id_, win_id_, url.c_str(), title.c_str());
> -
> -     // Check whether it exists
> -     sql = g_strdup_printf("SELECT tab_id FROM current_tabs WHERE
> tab_id=%d LIMIT 1", tab_id_);
> -     sqlite3_prepare_v2(m_panel_db, sql, -1, &select_stmt, NULL);
> -     g_free(sql);
> -
> -     rc = sqlite3_step(select_stmt);
> -     if(rc == SQLITE_DONE) // Not found
> -     {
> -             // Insert a record into current_tabs
> -             sql = g_strdup_printf("INSERT INTO current_tabs(tab_id, win_id, 
> url,
> title) VALUES(%d, %d, '%s', '%s')",
> -                             tab_id_, win_id_, url.c_str(), title.c_str());
> +     // Insert a record into current_tabs
> +     sql = g_strdup_printf("INSERT OR REPLACE INTO current_tabs(tab_id,
> win_id, url, title, favicon_id) "
> +                     "VALUES(%d, %d, '%s', '%s',(SELECT COALESCE((SELECT id 
> FROM
> favicons WHERE url='%s'), 0)))",
> +                     tab_id_, win_id_, url.c_str(), title.c_str(), 
> faviconUrl.c_str());
>
> -             char* errmsg;
> -             if(SQLITE_OK != sqlite3_exec(m_panel_db, sql, NULL, NULL,
> &errmsg))
> -             {
> -                     DBG("failed to exec '%s': %s", sql, errmsg);
> -                     g_free(errmsg);
> -             }
> -             g_free(sql);
> -     }
> -     else if(rc == SQLITE_ROW) // Found
> -     {
> -             sql = g_strdup_printf("UPDATE current_tabs SET win_id=%d, 
> url='%s',
> title='%s' WHERE tab_id=%d",
> -                             win_id_, url.c_str(), title.c_str(), tab_id_);
> -             char* errmsg;
> -             if(SQLITE_OK != sqlite3_exec(m_panel_db, sql, NULL, NULL,
> &errmsg))
> -             {
> -                     DBG("failed to exec '%s': %s", sql, errmsg);
> -                     g_free(errmsg);
> -             }
> -             g_free(sql);
> -     }
> -     else
> +     char* errmsg;
> +     if(SQLITE_OK != sqlite3_exec(m_panel_db, sql, NULL, NULL, &errmsg))
>       {
> -             DBG("failed to exec: %s", sqlite3_errmsg(m_panel_db));
> +             g_warning("failed to exec '%s': %s", sql, errmsg);
> +             g_free(errmsg);
>       }
> -     sqlite3_finalize(select_stmt);
> +     g_free(sql);
> +
>       return;
>  }
>
> @@ -942,14 +822,12 @@
>       tab_id_ = tab_id.convert_cast<int>();
>       newwin_id_ = newwin_id.convert_cast<int>();
>
> -     DBG("updateWindowId: tab_id=%d, newwin_id=%d", tab_id_,
> newwin_id_);
> -
>       char* sql = g_strdup_printf("UPDATE current_tabs SET win_id=%d WHERE
> tab_id=%d", newwin_id_, tab_id_);
>       char* errmsg = NULL;
>       rc = sqlite3_exec(m_panel_db, sql, NULL, NULL, &errmsg);
>       if(rc != SQLITE_OK)
>       {
> -             DBG("failed to exec '%s': %s", sql, errmsg);
> +             g_warning("failed to exec '%s': %s", sql, errmsg);
>               g_free(errmsg);
>       }
>       g_free(sql);
> @@ -962,13 +840,11 @@
>
>       if(!m_panel_db) return;
>
> -     DBG("clearAllTabItems ...");
> -
>       char* errmsg = NULL;
>       rc = sqlite3_exec(m_panel_db, "DELETE FROM current_tabs", NULL, NULL,
> &errmsg);
>       if(rc != SQLITE_OK)
>       {
> -             DBG("failed to clear tabs: %s", errmsg);
> +             g_warning("failed to clear tabs: %s", errmsg);
>               g_free(errmsg);
>       }
>       return;
> @@ -984,13 +860,11 @@
>
>       tab_id_ = tab_id.convert_cast<int>();
>
> -     DBG("removeTabItem: tab id = %d", tab_id_);
> -
>       char* delete_sql = g_strdup_printf("DELETE FROM current_tabs WHERE
> tab_id=%d", tab_id_);
>       rc = sqlite3_exec(m_panel_db, delete_sql, NULL, NULL, &errmsg);
>       if(rc != SQLITE_OK)
>       {
> -             DBG("Error: failed to exec '%s': %s", delete_sql);
> +             g_warning("Error: failed to exec : %s", errmsg);
>               g_free(errmsg);
>       }
>       g_free(delete_sql);
> @@ -1006,21 +880,19 @@
>
>       if(!m_panel_db) return;
>
> -     DBG("removeURLItem: url=%s", url.c_str());
> -
>       // Delete the item from urls
>       char* delete_sql = g_strdup_printf("DELETE FROM urls WHERE url='%s'",
> url.c_str());
>       rc = sqlite3_exec(m_panel_db, delete_sql, NULL, NULL, &errmsg);
>       if(rc != SQLITE_OK)
>       {
> -             DBG("Error: failed to exec '%s': %s", delete_sql);
> +             g_warning("Error: failed to exec: %s", errmsg);
>               g_free(errmsg);
>       }
>       g_free(delete_sql);
>
>       // Remove thumbnail file
>       char* csum = g_compute_checksum_for_string (G_CHECKSUM_MD5,
> url.c_str(), -1);
> -     char* filename = g_strconcat(csum, ".png", NULL);
> +     char* filename = g_strconcat(csum, ".jpg", NULL);
>       char* thumbnail_filename = g_build_filename(m_db_dirname,
> "thumbnails", filename, NULL);
>
>       g_remove(thumbnail_filename);
> @@ -1029,6 +901,7 @@
>       g_free(filename);
>       g_free(thumbnail_filename);
>
> +
>       return;
>  }
>
> @@ -1042,15 +915,16 @@
>       if(!m_panel_db) return;
>
>       id_ = g_ascii_strtoll(id.c_str(), NULL, 10);
> -     char* delete_sql = g_strdup_printf("DELETE FROM bookmarks WHERE
> id=%d", id_);
> +     char* delete_sql = g_strdup_printf("DELETE FROM bookmarks WHERE
> id=%lld", id_);
>       rc = sqlite3_exec(m_panel_db, delete_sql, NULL, NULL, &errmsg);
>       if(rc != SQLITE_OK)
>       {
> -             DBG("Error: failed to exec '%s': %s", delete_sql, errmsg);
> +             g_warning("Error: failed to exec '%s': %s", delete_sql, errmsg);
>               g_free(errmsg);
>       }
>
>       g_free(delete_sql);
> +
>  }
>
>  bool MeeGoPluginAPI::hasBookmarkImported()
> @@ -1067,7 +941,7 @@
>       if(b)
>       {
>               int fd = creat(fname, 0400);
> -             if(fd < 0) DBG("failed to create %s: %s", fname, 
> strerror(errno));
> +             if(fd < 0) g_warning("failed to create %s: %s", fname,
> strerror(errno));
>               else
>               {
>                       close(fd);
> --- chrome-meego-extension-0.2.0/plugin/src/MeeGoPluginAPI.h
> +++ chrome-meego-extension-0.2.0/plugin/src/MeeGoPluginAPI.h
> @@ -43,11 +43,9 @@
>      void setPageThumbnail(std::string url, std::string title, std::string
> thumbnail);
>
>       // Insert a URL item into urls table
> -     void addURLItem(std::string id, std::string url, std::string title,
> -                     FB::variant visit_count, FB::variant typed_count, 
> FB::variant
> last_visit_time,
> -                     std::string favicon_url);
> +     void addURLItem(std::string id, std::string url, std::string title, 
> std::string
> faviconUrl,
> +                     FB::variant visit_count, FB::variant typed_count, 
> FB::variant
> last_visit_time);
>
> -     // Update URL info
>       void updateURLInfo(std::string url, std::string title, std::string
> favicon_url);
>
>       // Clear URL table
> @@ -57,19 +55,19 @@
>       void removeURLItem(std::string id);
>
>       // Insert a bookmark item into bookmarks table
> -     void addBookmarkItem(std::string id, std::string url, std::string title,
> FB::variant dataAdded);
> +     void addBookmarkItem(std::string id, std::string url, std::string title,
> std::string faviconUrl, FB::variant dateAdded);
>
>       // Remove a bookmark item
>       void removeBookmarkItem(std::string id);
>
>       // Insert a favorite icon item into favicons table
> -     void addFavoriteIconItem(std::string url, FB::variant last_update,
> FB::variant icon_data );
> +     void addFavIconItem(std::string url, FB::variant last_update, 
> FB::variant
> data);
>
>       // Insert a thumbnail for a URL into thumbnails table
>       void addThumbnailItem(std::string url, FB::variant last_update, 
> std::string
> image_data);
>
>       // Insert a tab item into current_tabs table
> -     void addTabItem(FB::variant tab_id, FB::variant win_id, std::string url,
> std::string title);
> +     void addTabItem(FB::variant tab_id, FB::variant win_id, std::string url,
> std::string title, std::string faviconUrl);
>
>       // Clear all tabs
>       void clearAllTabItems();
>
> _______________________________________________
> Meego-commits mailing list
> [email protected]
> http://lists.meego.com/listinfo/meego-commits
_______________________________________________
MeeGo-packaging mailing list
[email protected]
http://lists.meego.com/listinfo/meego-packaging

Reply via email to