1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
--------------------------------------------------------
-- NoScript plugin for luakit --
-- (C) 2011 Mason Larobina <mason.larobina@gmail.com> --
--------------------------------------------------------
-- 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, _M.enable_scripts, not 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.enable_scripts = enable_scripts
view.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),
})
|