Created
June 15, 2011 02:05
-
-
Save mason-larobina/1026346 to your computer and use it in GitHub Desktop.
NoScript plugin for luakit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-------------------------------------------------------- | |
-- NoScript plugin for luakit -- | |
-- (C) 2011 Mason Larobina <[email protected]> -- | |
-------------------------------------------------------- | |
-- Get Lua environment | |
local os = require "os" | |
local tonumber = tonumber | |
local assert = assert | |
local table = table | |
local string = string | |
-- Get luakit environment | |
local webview = webview | |
local add_binds = add_binds | |
local lousy = require "lousy" | |
local sql_escape = lousy.util.sql_escape | |
local capi = { luakit = luakit, sqlite3 = sqlite3 } | |
module "noscript" | |
-- Default blocking values | |
enable_scripts = true | |
enable_plugins = true | |
create_table = [[ | |
CREATE TABLE IF NOT EXISTS by_domain ( | |
id INTEGER PRIMARY KEY, | |
domain TEXT, | |
enable_scripts INTEGER, | |
enable_plugins INTEGER | |
);]] | |
db = capi.sqlite3{ filename = capi.luakit.data_dir .. "/noscript.db" } | |
db:exec("PRAGMA synchronous = OFF; PRAGMA secure_delete = 1;") | |
db:exec(create_table) | |
local function btoi(bool) return bool and 1 or 0 end | |
local function itob(int) return tonumber(int) ~= 0 end | |
local function get_domain(uri) | |
uri = assert(lousy.uri.parse(uri), "invalid uri") | |
return string.lower(uri.host) | |
end | |
local function match_domain(domain) | |
local rows = db:exec(string.format("SELECT * FROM by_domain " | |
.. "WHERE domain == %s;", sql_escape(domain))) | |
if rows[1] then return rows[1] end | |
end | |
local function update(id, field, value) | |
db:exec(string.format("UPDATE by_domain SET %s = %d WHERE id == %d;", | |
field, btoi(value), id)) | |
end | |
local function insert(domain, enable_scripts, enable_plugins) | |
db:exec(string.format("INSERT INTO by_domain VALUES (NULL, %s, %d, %d);", | |
sql_escape(domain), btoi(enable_scripts), btoi(enable_plugins))) | |
end | |
function webview.methods.toggle_scripts(view, w) | |
local domain = get_domain(view.uri) | |
local enable_scripts = _M.enable_scripts | |
local row = match_domain(domain) | |
if row then | |
enable_scripts = itob(row.enable_scripts) | |
update(row.id, "enable_scripts", not enable_scripts) | |
else | |
insert(domain, not enable_scripts, _M.enable_plugins) | |
end | |
w:notify(string.format("%sabled scripts for domain: %s", | |
enable_scripts and "Dis" or "En", domain)) | |
end | |
function webview.methods.toggle_plugins(view, w) | |
local domain = get_domain(view.uri) | |
local enable_plugins = _M.enable_plugins | |
local row = match_domain(domain) | |
if row then | |
enable_plugins = itob(row.enable_plugins) | |
update(row.id, "enable_plugins", not enable_plugins) | |
else | |
insert(domain, not _M.enable_scripts, enable_plugins) | |
end | |
w:notify(string.format("%sabled plugins for domain: %s", | |
enable_plugins and "Dis" or "En", domain)) | |
end | |
function webview.methods.toggle_remove(view, w) | |
local domain = get_domain(view.uri) | |
db:exec(string.format("DELETE FROM by_domain WHERE domain == %s;", | |
sql_escape(domain))) | |
w:notify("Removed rules for domain: " .. domain) | |
end | |
webview.init_funcs.noscript_load = function (view) | |
view:add_signal("load-status", function (v, status) | |
if status ~= "committed" or v.uri == "about:blank" then return end | |
local enable_scripts, enable_plugins = _M.enable_scripts, _M.enable_plugins | |
local domain = get_domain(v.uri) | |
local row = match_domain(domain) | |
if row then | |
enable_scripts = itob(row.enable_scripts) | |
enable_plugins = itob(row.enable_plugins) | |
end | |
view:set_property("enable-scripts", enable_scripts) | |
view:set_property("enable-plugins", enable_plugins) | |
end) | |
end | |
local buf = lousy.bind.buf | |
add_binds("normal", { | |
buf("^,ts$", function (w) w:toggle_scripts() end), | |
buf("^,tp$", function (w) w:toggle_plugins() end), | |
buf("^,tr$", function (w) w:toggle_remove() end), | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment