Getting started with Google Chrome Plugin

Google Chrome plugin or extension, is a set of JS,CSS and HTML files along with a manifest file to define the permissions it requires. It also requires you to have icon file in the same folder. Note: In order to publish into the Chrome market: 1. you require at least one promotional image (small tile). 2. You can't specify access to localhost in your manifest. Eg: My Bookmark Searcher extension. Manifest:
{
  "name": "My Bookmark Searcher",
  "version": "1.4",
  "manifest_version": 4,
  "description": "Searches the content of bookmarked websites using power of Google",
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html",
    "default_title": "My Bookmark Searcher"
  },
  "content_scripts": [
    {
      "matches": ["http://*/*"],
      "js": ["jquery.js", "popup.js"]
    }
  ],
  "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'",
  "permissions": [
    "http://localhost:*/*",
    "http://*.heroku.com/*",
    "bookmarks",
    "tabs"
  ]
}
and the popup window when you click:
<!doctype html>
<html>
  <head>
    <title>Getting Started Extension\'s Popup</title>
    <style>
      body {
        min-width:357px;
       /* overflow-x:hidden;*/
      }

      img {
        margin:5px;
        border:2px solid black;
        vertical-align:middle;
        width:75px;
        height:75px;
      }
    </style>
    <!-- JavaScript and HTML must be in separate files for security. -->
    
    <!-- <script type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js\"></script> -->

    <script src=\"jquery.js\"></script>
    <script src=\"popup.js\"></script>
  </head>
  <body>
    <div id=\"fb-root\"></div>
    <div id=\"urls\"></div>
    <div id=\"status\" style=\"font-family:arial;color:#999999;\">Loading....</div>
  </body>
</html>
And the actual JS file: (which does everything)
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-32860962-1']);
_gaq.push(['_trackPageview']);

window.onload = function() { 
  var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  ga.src = 'https://ssl.google-analytics.com/ga.js';
  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);

  chrome.bookmarks.getTree(function(bookmarks) {
    printBookmarksOne(bookmarks);
    send_request();
  });
};


var links = "";

function openTab(bookmarks_id){
  // chrome.tabs.create({url: "http://localhost:3000/researches/"+bookmarks_id});
  chrome.tabs.create({url: "http://googlesupport.heroku.com/researches/"+bookmarks_id});
}


function send_request(){
  if (typeof jQuery  == 'undefined') {
     document.getElementById('status').innerHTML = "jquery not found....";
  }

 $.ajax({
  // url: "http://localhost:3000/researches?callback=openTab",
  url: "http://googlesupport.heroku.com/researches?callback=openTab",
  type: "POST",
  data: {"bookmarks" : links},
  dataType: "json",
  success: function(obj){openTab(obj);},
  error: function(jqXHR, textStatus, errorThrown){document.getElementById('status').innerHTML = textStatus+' '+errorThrown;}
  });

}

function printBookmarksOne(bookmarks) {
  bookmarks.forEach(function(bookmark) {
    if(isUrl(bookmark.url)){
        links += bookmark.url + "__";
    }
    if (bookmark.children){
      printBookmarksOne(bookmark.children);
    }
  });
}

function isUrl(url_string){
  var re = /^(http[s]?:\/\/){0,1}(www\.){0,1}[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,5}[\.]{0,1}/;
  return re.test(url_string);
}

No comments: