I have made a Chrome extension to generate a summary of any document.I added the feature of opening the popup using the browser action icon, and now I want to add the same functionality using a context menu right-click action.
Now, when the popup2.html is opened using windows.create(), the window opens as it is and no message is sent to the popup.js script and in turn the innerHtml of the popup window which I opened in the background.js script is not modified.
I tried to use the chrome.tabs.sendMessage method to send a message to the popup window but am not able to change its html there.
background.js
chrome.runtime.onInstalled.addListener(function() {
var context = "selection";
var title = "See the Gist";
var id = chrome.contextMenus.create({"title": title, "contexts":[context],"id": "context_selection"});
});
var open_window_ids=[]
function getSummary(selected) {
var jsonData;
$.ajax({
url: 'http://127.0.0.1:5000/api/summarize',
type: 'POST',
data: JSON.stringify(selected),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
async: false,
success: function(data) {
jsonData = data;
}
});
return jsonData;
}
console.log("Booting");
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
var activeTab = tabs[0];
chrome.tabs.sendMessage(activeTab.id, {"message": "get_selected_text"}, function(response) {
console.log('From button');
if (response.selected_text == "") {
document.body.innerHTML += "<h3 style='text-align: center'>No text selected! Select text and try again.</h3>";
}
else {
var apiResponse = getSummary(response);
console.log(apiResponse);
if (!apiResponse)
{
document.getElementById("header").innerHTML += "<h3 class='heading'>API response unavailable.</h3>";
}
var summary_final = apiResponse.sentences;
if (summary_final.length == 0) {
document.getElementById("header").innerHTML += "<h3 class='heading'>Not enough text selected to generate summary. Select larger block of text and try again.</h3>";
document.getElementById("footer").innerHTML += "<div style='padding:15px;'>Powered by <a href='http://zippybots.com' target='_blank'><span id='link'>Zippybots</span></a></div>";
}
else{
document.getElementById("header").innerHTML += "<h1 class='heading'>The Gist is.....</h1>";
var para = "";
for (var i = 0;i<summary_final.length;i++)
{
para += summary_final[i]+" ";
if( i % 3 == 2)
{
document.getElementById("summary").innerHTML += "<p class='point'>"+para+"</p>";
para = "";
}
}
if (para) document.getElementById("summary").innerHTML += "<p class='point'>"+para+"</p>";
document.getElementById("footer").innerHTML += "<div style='padding:15px;'>Powered by <a href='http://zippybots.com' target='_blank'><span id='link'>Zippybots</span></a></div>";
}
}
});
});
chrome.contextMenus.onClicked.addListener(function(info, tab){
if (info.menuItemId == "context_selection") {
for (var i = open_window_ids.length - 1; i >= 0; i--) {
chrome.windows.remove(open_window_ids[i],function(){});
open_window_ids.pop();
}
// window.document.body.innerHTML += doc;
var activeTab;
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
activeTab = tabs[0];
chrome.windows.create({url: 'popup2.html',focused:true,type:'popup'},function(win){
open_window_ids.push(win.id);
displayCurrent(open_window_ids[0],activeTab.id,win);
});
});
}
});
function displayCurrent(id,activeTabId,popupwindow){
console.log("Got selection tab id :"+activeTabId);
var popupTabId = popupwindow.tabs[0].id;
console.log("Got popup tab id :"+popupTabId);
chrome.tabs.sendMessage(activeTabId, {"message": "get_selected_text"}, function(response) {
console.log("Resp:"+response.selected_text);
if (response.selected_text == "") {
console.log("Selected text is null");
chrome.tabs.sendMessage(popupTabId,{"message":"no_text_selected"},function (response){});
}
else {
var apiResponse = getSummary(response);
if (!apiResponse)
{
document.getElementById("header").innerHTML += "<h3 class='heading'>API response unavailable.</h3>";
}
var summary_final = apiResponse.sentences;
if (summary_final.length == 0) {
console.log("Summary length 0");
chrome.tabs.sendMessage(popupTabId,{"message":"not_enough_text"},function (response){});
}
else {
console.log("Summary there");
chrome.tabs.sendMessage(popupTabId,{"message":"summary","data":summary_final},function (response){});
}
}
});
}
popup2.html
<html>
<head>
<meta charset="utf-8">
<link href="bootstrap.min.css" rel="stylesheet">
<script src="jquery-3.1.1.min.js"></script>
<script src="bootstrap.min.js"></script>
<!-- <script src="api-keys.js"/></script> -->
<link href="https://fonts.googleapis.com/css?family=Ubuntu" rel="stylesheet">
<script type="text/javascript" src="popup.js"></script>
<script type="text/javascript" src="background.js"></script>
<style>
body{
min-width: 750px;
font-family: 'Ubuntu', sans-serif;
background: #f1f1f1;
/*background: #2c001e;*/
}
#header{
/*background: #dd4814;*/
background: #2c001e;
/*color: #dd4814;*/
color: #fff;
text-align: center;
padding: 1px;
}
#footer{
/*background: #dd4814;*/
background: #2c001e;
color: #fff;
text-align: right;
min-height: 50px;
}
#link{
/*color: #fff; */
color: #dd4814;
}
.point{
color: #333;
/*background: #2c001e;*/
background: #f1f1f1;
text-align: justify;
padding: 5px;
}
#summary{
background: #f1f1f1;
/*background: #2c001e;*/
max-width: 720px;
font-weight: 300;
font-size:15px;
font-family: Ubuntu, Arial, "libra sans", sans-serif;
padding-left: 30px;
}
.heading{
margin-top: 10px;
margin-bottom: 10px;
}
</style>
</head>
<body>
<div id="header"></div>
<!-- This will be populated when extension button is clicked -->
<div id="summary"><br></div>
<div id="footer">
</div>
</body>
</html>
content.js
console.log("Content file loaded");
chrome.runtime.onMessage.addListener( function(request, sender, sendResponse) {
if (request.message == "get_selected_text") {
var selectedText = document.getSelection().toString();
sendResponse({selected_text: selectedText});
return true;
}
});
manifest.json
{
"manifest_version": 2,
"name": "Selection Summarizer",
"description": "A chrome extension that allows users to get a summary of a news article or large block of text.",
"version": "1.0",
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": ["jquery-3.1.1.min.js", "content.js","popup.js"]
}
],
"background": {
"scripts": ["background.js"],
"persistent" :false
},
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html",
"default_title": "Summarize!"
},
"icons": { "16": "icons/icon16.png",
"48": "icons/icon48.png",
"128": "icons/icon128.png" },
"permissions": ["activeTab", "tabs","contextMenus",
"http://127.0.0.1:5000/*","https://en.wikipedia.org/*"]
}
popup.js
chrome.runtime.onMessage.addListener( function(request, sender, sendResponse) {
if (request.message == "no_text_selected") {
console.log("no_text_selected");
document.body.innerHTML += "<h3 style='text-align: center'>No text selected! Select text and try again.</h3>";
}
else if (request.message == "not_enough_text") {
console.log("not enough text");
document.getElementById("header").innerHTML += "<h3 class='heading'>Not enough text selected to generate summary. Select larger block of text and try again.</h3>";
document.getElementById("footer").innerHTML += "<div style='padding:15px;'>Powered by <a href='http://zippybots.com' target='_blank'><span id='link'>Zippybots</span></a></div>";
}
else if (request.message == "summary") {
console.log("Summary printing");
var summary_final = request.data;
console.log(summary_final);
document.getElementById("header").innerHTML += "<h1 class='heading'>Summary</h1>";
var para = "";
for (var i = 0;i<summary_final.length;i++)
{
para += summary_final[i]+" ";
if( i % 3 == 2)
{
document.getElementById("summary").innerHTML += "<p class='point'>"+para+"</p>";
para = "";
}
}
if (para) document.getElementById("summary").innerHTML += "<p class='point'>"+para+"</p>";
document.getElementById("footer").innerHTML += "<div style='padding:15px;'>Powered by <a href='http://zippybots.com' target='_blank'><span id='link'>Zippybots</span></a></div>";
}
return true;
});
content.js
console.log("Content file loaded");
chrome.runtime.onMessage.addListener( function(request, sender, sendResponse) {
if (request.message == "get_selected_text") {
var selectedText = document.getSelection().toString();
sendResponse({selected_text: selectedText});
return true;
}
});
popup.html
<html>
<head>
<meta charset="utf-8">
<link href="bootstrap.min.css" rel="stylesheet">
<script src="jquery-3.1.1.min.js"></script>
<script src="bootstrap.min.js"></script>
<!-- <script src="api-keys.js"/></script> -->
<link href="https://fonts.googleapis.com/css?family=Ubuntu" rel="stylesheet">
<script type="text/javascript" src="content.js"></script>
<script type="text/javascript" src="background.js"></script>
<style>
body{
min-width: 550px;
font-family: 'Ubuntu', sans-serif;
background: #f1f1f1;
/*background: #2c001e;*/
}
#header{
/*background: #dd4814;*/
background: #2c001e;
/*color: #dd4814;*/
color: #fff;
text-align: center;
padding: 1px;
}
#footer{
/*background: #dd4814;*/
background: #2c001e;
color: #fff;
text-align: right;
min-height: 50px;
}
#link{
/*color: #fff; */
color: #dd4814;
}
.point{
color: #333;
/*background: #2c001e;*/
background: #f1f1f1;
text-align: justify;
padding: 5px;
}
#summary{
background: #f1f1f1;
/*background: #2c001e;*/
max-width: 720px;
font-weight: 300;
font-size:15px;
font-family: Ubuntu, Arial, "libra sans", sans-serif;
padding-left: 30px;
}
.heading{
margin-top: 10px;
margin-bottom: 10px;
}
</style>
</head>
<body>
<div id="header"></div>
<!-- This will be populated when extension button is clicked -->
<div id="summary"><br></div>
<div id="footer">
</div>
</body>
</html>