From cbda1909ba2401c0e9a401a1c6b772879ed886d4 Mon Sep 17 00:00:00 2001 From: Carlo Mandelli Date: Sat, 8 Aug 2020 10:48:34 +0200 Subject: [PATCH] First commit --- .gitignore | 1 + COPYING | 674 ++++++++++++++++++++++++++++++ README.md | 54 +++ extension/background.js | 26 ++ extension/content.css | 25 ++ extension/content.js | 191 +++++++++ extension/img/icon128.png | Bin 0 -> 9031 bytes extension/img/icon16.png | Bin 0 -> 1152 bytes extension/img/icon19-disabled.png | Bin 0 -> 4655 bytes extension/img/icon19-enabled.png | Bin 0 -> 1204 bytes extension/img/icon32.png | Bin 0 -> 2042 bytes extension/img/icon38.png | Bin 0 -> 2462 bytes extension/img/icon48.png | Bin 0 -> 3031 bytes extension/manifest.json | 48 +++ 14 files changed, 1019 insertions(+) create mode 100644 .gitignore create mode 100644 COPYING create mode 100644 README.md create mode 100644 extension/background.js create mode 100644 extension/content.css create mode 100644 extension/content.js create mode 100644 extension/img/icon128.png create mode 100644 extension/img/icon16.png create mode 100644 extension/img/icon19-disabled.png create mode 100644 extension/img/icon19-enabled.png create mode 100644 extension/img/icon32.png create mode 100644 extension/img/icon38.png create mode 100644 extension/img/icon48.png create mode 100644 extension/manifest.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ee88966 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +assets/ diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..27e743b --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +![logo](../assets/logo.png?raw=true) + +# JustLines - Chrome extension +> Draw lines in your browser changing colors and pen sizes scrolling the mouse wheel +

+ demo +

+ +JustLines is a Chrome extension to quickly draw simple colored lines in your browser. You can do it on remote or local sites and even pdf files. + +You can use it during presentation to highlight some contents or draw simple schemas. + +I like to use these kind of tools during presentations and I needed a quick way to change colors and pen size without using popups or options menu but do it keeping the mouse at the current position on the draw. So I decided to use mouse wheel as main controller to change colors and pen size. + +## Getting started + +* automatic installation: directly from Chrome Web Store (coming soon) +* manual installation: + * download and extract the archive of the [latest release](https://github.com/camandel/JustLines/releases/latest) + * or clone the repository: + ```shell + git clone https://github.com/camandel/JustLines.git + ``` + * Enable `Developer mode` in [Chrome extension](chrome://extensions/) + * Press `Load unpacked` and select the direcotry `extension` from the previously cloned repo + * Open a web page and click on the icon icon-disabled to enter drawing mode + * Change color (scrolling `mouse wheel`) and pen size (press `Shift` while scrolling `mouse wheel`) + * Press `left button` and start moving the mouse to draw a line + + +## Features + +* press `Ctrl+Shit+S` or click on the extension icon to enable/disable drawing mode +* you can also press `ESC` to disable drawing mode +* keep `left button` pressed and move the mouse to draw +* change pen colors scrolling the `mouse wheel` +* change pen size pressing `Shift` and scroll the `mouse wheel` +* clear draw pressing `Space` or leaving drawing mode + + +## Contributing + +If you'd like to contribute, please fork the repository and use a feature branch. Pull requests are warmly welcome. + + +## Links + +- Repository: https://github.com/camandel/JustLines +- Issue tracker: https://github.com/camandel/JustLines/issues +- Demo video: https://www.youtube.com/watch?v=hXOa06qxchw + +## Licensing + +The code in this project is licensed under GNU General Public License v3.0. diff --git a/extension/background.js b/extension/background.js new file mode 100644 index 0000000..d1ae2b2 --- /dev/null +++ b/extension/background.js @@ -0,0 +1,26 @@ +// start as disabled +chrome.storage.local.set({ status: "disabled" }); + +chrome.browserAction.onClicked.addListener(function () { + // change status from action icon + chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + var activeTab = tabs[0]; + chrome.tabs.sendMessage(activeTab.id, { message: "change_status" }); + }); +}); + +chrome.commands.onCommand.addListener(function (command) { + // change status from command + if (command === "toggle") { + chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + var activeTab = tabs[0]; + chrome.tabs.sendMessage(activeTab.id, { "message": "change_status" }); + }); + } +}); + +chrome.runtime.onMessage.addListener(function (request) { + // change action icon and save new status + chrome.browserAction.setIcon({ path: `img/icon19-${request.cmd}.png` }); + chrome.storage.local.set({ status: `${request.cmd}` }); +}); diff --git a/extension/content.css b/extension/content.css new file mode 100644 index 0000000..951f232 --- /dev/null +++ b/extension/content.css @@ -0,0 +1,25 @@ +#JustLines-canvas { + margin: 0; + padding: 0; + position: fixed; + z-index: 99999999; +} + +.cursor { + background: red; + width: 12px; + height: 12px; + border: 2px solid rgb(41, 41, 41); + border-radius: 50%; + position: fixed; + transform: translate(-50%, -50%); + pointer-events: none; + z-index: 99999999; +} + +.prepare-canvas { + margin: 0 !important; + padding: 0 !important; + overflow: "hidden" !important; + cursor: none !important; +} \ No newline at end of file diff --git a/extension/content.js b/extension/content.js new file mode 100644 index 0000000..1eb1ab5 --- /dev/null +++ b/extension/content.js @@ -0,0 +1,191 @@ +let ctx, canvas, cursor; +let pen = { + x: 0, + y: 0, + click: false, + color: 0, + size: 12, + colors: ["red", "green", "yellow", "blue", "white", "black"], + + getXpx() { + return `${this.x}px`; + }, + getYpx() { + return `${this.y}px`; + }, + getColor() { + return this.colors[this.color]; + }, + getSizePx() { + return `${this.size}px`; + } +}; + +chrome.runtime.onMessage.addListener(function (request) { + if (request.message === "change_status") { + chrome.storage.local.get("status", data => { + if (data.status === "disabled") { + draw(); + } else { + removeCanvas(); + } + }); + } +}, +); + +function createCanvas() { + + document.body.classList.add("prepare-canvas"); + + // add div for cursor + cursor = document.createElement("div"); + cursor.id = "JustLines-cursor"; + cursor.classList.add("cursor"); + cursor.style.top = pen.getYpx(); + cursor.style.left = pen.getXpx(); + document.body.insertBefore(cursor, document.body.firstChild); + + // add canvas + canvas = document.createElement("canvas"); + canvas.id = "JustLines-canvas"; + ctx = canvas.getContext("2d"); + document.body.insertBefore(canvas, document.body.firstChild); + + resizeCanvas(); + setPen(); + +} + +function resizeCanvas() { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; +} + +function removeCanvas() { + if (canvas) { + document.getElementById("JustLines-canvas").remove(); + document.getElementById("JustLines-cursor").remove(); + + document.removeEventListener("mousemove", mouseMoveHandler); + document.removeEventListener("mousedown", mouseDownHandler); + document.removeEventListener("mouseup", mouseUpHandler); + document.removeEventListener("keydown", keyDownHandler); + document.removeEventListener("wheel", wheelHandler); + + document.body.classList.remove("prepare-canvas"); + } + + // change icon + chrome.runtime.sendMessage({ cmd: "disabled" }); +} + +function wheelHandler(e) { + e.preventDefault(); + + if (e.shiftKey) { + // change size + if (e.deltaY > 0) { + pen.size += 2; + } else { + pen.size -= 2; + } + + if (pen.size < 3) { + pen.size = 3; + } else if (pen.size > 35) { + pen.size = 35; + } + } else { + // change color + if (e.deltaY > 0) { + pen.color += 1; + } else { + pen.color -= 1; + } + if (pen.color >= pen.colors.length) { + pen.color = 0; + } else if (pen.color < 0) { + pen.color = pen.colors.length - 1; + } + } + setPen(); +} + +function keyDownHandler(e) { + e.preventDefault(); + if (e.key === ' ') { + // clear draw + resizeCanvas(); + } else if (e.key === "Escape") { + // exit + removeCanvas(); + } +}; + +function mouseDownHandler(e) { + e.preventDefault(); + if (e.button === 0) { + pen.click = true; + } +} + +function mouseUpHandler(e) { + pen.click = false; +} + +function mouseMoveHandler(e) { + + let lastX, lastY; + + pen.x = e.clientX; + pen.y = e.clientY; + + cursor.style.top = pen.getYpx(); + cursor.style.left = pen.getXpx(); + + if (pen.click) { + if (pen.x === 0) { + pen.x = lastX; + } else if (pen.x > canvas.width) { + pen.x = canvas.width; + } + + if (pen.y === 0) { + pen.y = lastY; + } else if (pen.y > canvas.height) { + pen.y = canvas.height; + } + + ctx.lineTo(pen.x, pen.y); + ctx.strokeStyle = pen.getColor(); + ctx.lineWidth = pen.size; + ctx.stroke(); + lastX = pen.x; + lastY = pen.y; + } else { + ctx.beginPath(); + ctx.moveTo(pen.x, pen.y); + } +} + +function setPen() { + cursor.style.background = pen.getColor(); + cursor.style.width = pen.getSizePx(); + cursor.style.height = pen.getSizePx(); +} + +function draw() { + + createCanvas(); + + document.addEventListener("mousemove", mouseMoveHandler); + document.addEventListener("mousedown", mouseDownHandler, { passive: false }); + document.addEventListener("mouseup", mouseUpHandler); + document.addEventListener("keydown", keyDownHandler, { passive: false }); + document.addEventListener("wheel", wheelHandler, { passive: false }); + window.onresize = resizeCanvas(); + + // change icon + chrome.runtime.sendMessage({ cmd: "enabled" }); +} diff --git a/extension/img/icon128.png b/extension/img/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..53447ebe07a8396127fdb88ced86fcfb7ab2013d GIT binary patch literal 9031 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 literal 0 HcmV?d00001 diff --git a/extension/img/icon16.png b/extension/img/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2391c818e6f2ddee18dbe2354201431a2273f0 GIT binary patch literal 1152 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 literal 0 HcmV?d00001 diff --git a/extension/img/icon19-enabled.png b/extension/img/icon19-enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba80d8e497ce51fde0bbd6e4dd3588b07dfb303 GIT binary patch literal 1204 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 Y0DxN&*nD*7zyJUM07*qoM6N<$f}PRh`v3p{ literal 0 HcmV?d00001 diff --git a/extension/img/icon38.png b/extension/img/icon38.png new file mode 100644 index 0000000000000000000000000000000000000000..4540415019a647dfb8af5509e83f46285bda0335 GIT binary patch literal 2462 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 literal 0 HcmV?d00001 diff --git a/extension/img/icon48.png b/extension/img/icon48.png new file mode 100644 index 0000000000000000000000000000000000000000..aa7209228bcdc965205d731f3ee7f081ff7c401b GIT binary patch literal 3031 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 literal 0 HcmV?d00001 diff --git a/extension/manifest.json b/extension/manifest.json new file mode 100644 index 0000000..2601d47 --- /dev/null +++ b/extension/manifest.json @@ -0,0 +1,48 @@ +{ + "manifest_version": 2, + "name": "JustLines", + "version": "0.1.0", + "description": "Draw lines in your browser and change colors and pen sizes scrolling the mouse wheel", + "homepage_url": "https://github.com/camandel/JustLines", + "icons": { + "16": "img/icon16.png", + "32": "img/icon32.png", + "48": "img/icon48.png", + "128": "img/icon128.png" + }, + "permissions": [ + "activeTab", + "storage" + ], + "background": { + "scripts": [ + "background.js" + ] + }, + "browser_action": { + "default_title": "JustLines shortcuts:\n\n- Click the icon to enable/disable drawing mode\n- Ctrl+Shift+S to enable/disable drawing mode\n- ESC to disable drawing mode\n- Mouse wheel to change pen colors\n- Shift+Mouse wheel to change pen size\n- Space to clear the draw\n", + "default_icon": "img/icon19-disabled.png" + }, + "content_scripts": [ + { + "matches": [ + "" + ], + "js": [ + "content.js" + ], + "css": [ + "content.css" + ] + } + ], + "commands": { + "toggle": { + "suggested_key": { + "default": "Ctrl+Shift+S", + "mac": "Command+Shift+S" + }, + "description": "Toggle feature" + } + } +} \ No newline at end of file