From a582bd11208239dc75b21134eaa238daefdd306e Mon Sep 17 00:00:00 2001 From: "bob.rao" Date: Fri, 21 Apr 2023 12:33:49 +0800 Subject: [PATCH] first time worked --- LICENSE | 674 ------------------------------------- README.md | 2 - addCheckboxes.js | 21 ++ background.js | 37 +- bulkDeleteConversations.js | 127 +++++++ content.js | 127 ------- icon48.png | Bin 3750 -> 42541 bytes manifest.json | 27 +- popup.css | 14 + popup.html | 11 +- popup.js | 21 +- removeCheckboxes.js | 7 + 12 files changed, 209 insertions(+), 859 deletions(-) delete mode 100644 LICENSE delete mode 100644 README.md create mode 100644 addCheckboxes.js create mode 100644 bulkDeleteConversations.js delete mode 100644 content.js create mode 100644 popup.css create mode 100644 removeCheckboxes.js diff --git a/LICENSE b/LICENSE deleted file mode 100644 index f288702..0000000 --- a/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - 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 deleted file mode 100644 index 37317de..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# bulk-delete-chatGPT -bulk delete chatGPT conversations diff --git a/addCheckboxes.js b/addCheckboxes.js new file mode 100644 index 0000000..93a8c5e --- /dev/null +++ b/addCheckboxes.js @@ -0,0 +1,21 @@ +function addCheckboxes() { + const conversations = document.querySelectorAll( + '.flex.flex-col.gap-2.pb-2.text-gray-100.text-sm > .flex.py-3.px-3.items-center.gap-3.relative.rounded-md' + ); + + conversations.forEach((conversation, index) => { + const existingCheckbox = conversation.querySelector('.conversation-checkbox'); + if (!existingCheckbox) { + const checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + checkbox.className = 'conversation-checkbox'; + checkbox.dataset.index = index; // 设置 data-index 属性 + checkbox.addEventListener('click', (e) => { + e.stopPropagation(); + }); + conversation.insertBefore(checkbox, conversation.firstChild); + } + }); +} + +addCheckboxes(); diff --git a/background.js b/background.js index e004326..234da63 100644 --- a/background.js +++ b/background.js @@ -1,28 +1,15 @@ -chrome.webRequest.onCompleted.addListener( - (details) => { - if ( - details.url.includes( - "https://chat.openai.com/backend-api/conversations?" - ) - ) { - chrome.tabs.sendMessage(details.tabId, { - message: "conversations_data_fetched", - }); - } - }, - { urls: [""] } - ); - - chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { - if (request.message === "fetch_conversations_data") { - fetch(request.url) - .then((response) => response.json()) - .then((data) => { - sendResponse({ data: data.items }); - }) - .catch((error) => { - console.error("Error fetching conversations data:", error); - }); +console.log('Sending checkedIndexes from background:', checkedIndexes); +chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + chrome.tabs.sendMessage(tabs[0].id, { type: 'checkedIndexes', checkedIndexes: checkedIndexes }); +}); + +chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { + if (request.type === 'setCheckedIndexes') { + chrome.storage.local.set({ checkedIndexes: request.checkedIndexes }); + } else if (request.type === 'getCheckedIndexes') { + chrome.storage.local.get(['checkedIndexes'], (result) => { + sendResponse(result.checkedIndexes || []); + }); return true; } }); diff --git a/bulkDeleteConversations.js b/bulkDeleteConversations.js new file mode 100644 index 0000000..10a9831 --- /dev/null +++ b/bulkDeleteConversations.js @@ -0,0 +1,127 @@ +async function bulkDeleteConversations() { + const conversationCheckboxes = document.querySelectorAll('.conversation-checkbox:checked'); + const checkedIndexes = Array.from(conversationCheckboxes).map(checkbox => parseInt(checkbox.dataset.index)); + if (checkedIndexes.length === 0) { + console.log("No conversations to delete."); + + // Remove all checkboxes + const removeConversationCheckboxes = document.querySelectorAll('.conversation-checkbox'); + removeConversationCheckboxes.forEach(checkbox => { + checkbox.remove(); + }); + + return; + } + + const waitForElement = (selector, timeout = 5000) => { + return new Promise((resolve, reject) => { + const element = document.querySelector(selector); + if (element) { + resolve(element); + } + + const observer = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + if (!mutation.addedNodes) return; + + for (const node of mutation.addedNodes) { + if (node.matches && node.matches(selector)) { + observer.disconnect(); + resolve(node); + return; + } + } + }); + }); + + + setTimeout(() => { + observer.disconnect(); + reject(new Error('Element not found.')); + }, timeout); + + observer.observe(document.body, { + childList: true, + subtree: true + }); + }); + }; + + console.log("开始删除...") + const checkbox = conversationCheckboxes[0]; + const currentIndex = parseInt(checkbox.dataset.index); + console.log("currentIndex:", currentIndex); + const conversationElement = checkbox.closest('.flex.py-3.px-3.items-center.gap-3.relative.rounded-md'); + conversationElement.click(); // Click the conversation first + await new Promise(resolve => setTimeout(resolve, 500)); // Add a delay of 0.5 second + + const deleteButton = document.querySelector('.absolute.flex.right-1.z-10.text-gray-300.visible button:nth-child(2)'); // Updated delete button selector + + if (deleteButton) { + console.log("点击删除按钮...") + deleteButton.click(); // Click the delete button + await waitForElement('.absolute.flex.right-1.z-10.text-gray-300.visible'); + const buttonsContainer = document.querySelector('.absolute.flex.right-1.z-10.text-gray-300.visible'); + const confirmButton = buttonsContainer.querySelector('button:nth-child(1)'); // Get the first button as confirm button + if (confirmButton) { + console.log("点击确认按钮...") + confirmButton.click(); + await new Promise(resolve => setTimeout(resolve, 1000)); // Add a delay of 1 second + } + } + + console.log("delete done") + + // 在这里删除当前选中的对话的索引 + console.log("删除当前选中的对话的索引...") + console.log("checkedIndexes before splice", checkedIndexes); + const indexToRemove = checkedIndexes.indexOf(currentIndex); + if (indexToRemove > -1) { + checkedIndexes.splice(indexToRemove, 1); + } + console.log("checkedIndexes after splice", checkedIndexes); + + // 更新剩余对话的索引 + console.log("更新剩余对话的索引...") + for (let j = 0; j < checkedIndexes.length; j++) { + if (checkedIndexes[j] > currentIndex) { + checkedIndexes[j]--; + } + } + console.log("checkedIndexes after update index", checkedIndexes); + + // Wait for 1 second before deleting the next conversation + await new Promise(resolve => setTimeout(resolve, 1000)); + + // 重新添加复选框并设置它们的状态 + console.log("重新添加复选框并设置它们的状态...") + await addCheckboxesWithState(checkedIndexes); + + console.log("递归调用 bulkDeleteConversations...") + bulkDeleteConversations(); +} + +async function addCheckboxesWithState(checkedIndexes) { + // 在这里重新添加复选框 + const conversations = document.querySelectorAll('.flex.py-3.px-3.items-center.gap-3.relative.rounded-md.hover\\:bg-\\[\\#2A2B32\\].cursor-pointer.break-all.hover\\:pr-4.group'); + conversations.forEach((conversation, index) => { + const checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + checkbox.className = 'conversation-checkbox'; + checkbox.dataset.index = index; + + if (checkedIndexes.includes(index)) { + checkbox.checked = true; + } + + conversation.insertAdjacentElement('afterbegin', checkbox); + }); + + // Update data-index attributes for remaining checkboxes + const remainingCheckboxes = document.querySelectorAll('.conversation-checkbox'); + for (let i = 0; i < remainingCheckboxes.length; i++) { + remainingCheckboxes[i].dataset.index = i; + } +} + +bulkDeleteConversations(); \ No newline at end of file diff --git a/content.js b/content.js deleted file mode 100644 index e553b33..0000000 --- a/content.js +++ /dev/null @@ -1,127 +0,0 @@ -console.log('content.js is running'); - -// 向每个会话前添加复选框 -// 向每个会话前添加复选框 -// function addCheckboxes() { -// const conversations = document.querySelectorAll( -// '.flex.flex-col.gap-2.pb-2.text-gray-100.text-sm > .flex.py-3.px-3.items-center.gap-3.relative.rounded-md.hover\\:bg-\\[\\#2A2B32\\].cursor-pointer.break-all.hover\\:pr-4.group' -// ); - -// conversations.forEach((conversation) => { -// const checkbox = document.createElement('input'); -// checkbox.type = 'checkbox'; -// checkbox.className = 'conversation-checkbox'; -// conversation.insertBefore(checkbox, conversation.firstChild); -// }); -// } - -document.addEventListener("fetch", (event) => { - const response = event.detail.response; - - if (response) { - console.log("Result found:", response); - // 在这里执行你的逻辑 - } - }); - - - -function addCheckboxes() { - console.log(`try to addCheckboxes...`); - const conversations = document.querySelectorAll( - '.flex.flex-col.gap-2.pb-2.text-gray-100.text-sm > .flex.py-3.px-3.items-center.gap-3.relative.rounded-md.hover\\:bg-\\[\\#2A2B32\\].cursor-pointer.break-all.hover\\:pr-4.group' - ); - - conversations.forEach((conversation) => { - const checkbox = document.createElement('input'); - checkbox.type = 'checkbox'; - checkbox.className = 'conversation-checkbox'; - checkbox.addEventListener('click', (event) => { - event.stopPropagation(); - }); - conversation.insertBefore(checkbox, conversation.firstChild); - }); - } - - - - - - -chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { - if (request.message === 'add_checkboxes') { - addCheckboxes(); - } else if (request.message === 'delete_selected_conversations') { - deleteSelectedConversations(); - } -}); - -async function fetchAllConversations(offset = 0, limit = 20) { - const response = await fetch( - `https://chat.openai.com/backend-api/conversations?offset=${offset}&limit=${limit}` - ); - const data = await response.json(); - const conversations = data.items; - - if (conversations.length === limit) { - const nextConversations = await fetchAllConversations(offset + limit, limit); - return [...conversations, ...nextConversations]; - } - - return conversations; - } - - async function buildTitleToIdMap() { - const conversations = await fetchAllConversations(); - const titleToIdMap = {}; - - conversations.forEach((conversation) => { - const title = conversation.title; - if (titleToIdMap[title]) { - titleToIdMap[title].push(conversation.id); - } else { - titleToIdMap[title] = [conversation.id]; - } - }); - - return titleToIdMap; - } - - async function deleteSelectedConversations() { - const titleToIdMap = await buildTitleToIdMap(); - const checkboxes = document.querySelectorAll('.conversation-checkbox:checked'); - const conversationIds = []; - - checkboxes.forEach((checkbox) => { - const titleElement = checkbox.parentElement.querySelector('.text-ellipsis'); - const title = titleElement.textContent; - const conversationId = titleToIdMap[title].shift(); - - if (conversationId) { - conversationIds.push(conversationId); - } - }); - - await Promise.all( - conversationIds.map(async (id) => { - console.log(`try to delete conversation with ID: ${id}`); - await fetch(`https://chat.openai.com/backend-api/conversation/${id}`, { - method: 'PATCH', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - status: 'deleted', - }), - }); - - console.log(`Deleted conversation with ID: ${id}`); - }) - ); - - location.reload(); - } - - - - diff --git a/icon48.png b/icon48.png index 45eef6b851b8ac05e85d5ac4993662acf4e0bb84..d3f026968c09e64aa55c651afd27947086a2ca38 100644 GIT binary patch literal 42541 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" - ], "browser_action": { "default_icon": "icon48.png", - "default_popup": "popup.html" + "default_popup": "popup.html", + "default_title": "批量删除对话" + }, + "permissions": [ + "activeTab", + "storage" + ], + "background": { + "scripts": ["background.js"], + "persistent": false }, "content_scripts": [ { - "matches": ["https://chat.openai.com/*"], - "js": ["content.js"] + "matches": ["*://chat.openai.com/*"], + "js": ["addCheckboxes.js", "bulkDeleteConversations.js"] } ] } diff --git a/popup.css b/popup.css new file mode 100644 index 0000000..e113b42 --- /dev/null +++ b/popup.css @@ -0,0 +1,14 @@ +body { + width: 200px; + padding: 15px; + font-family: Arial, sans-serif; +} + +button { + display: block; + margin-bottom: 10px; + width: 100%; + padding: 5px; + font-size: 14px; + cursor: pointer; +} diff --git a/popup.html b/popup.html index b023e5d..7c9f99e 100644 --- a/popup.html +++ b/popup.html @@ -3,14 +3,13 @@ - Bulk Delete ChatGPT Conversations + ChatGPT Bulk Delete + - - - + + + - - diff --git a/popup.js b/popup.js index 562b47b..c44a226 100644 --- a/popup.js +++ b/popup.js @@ -1,14 +1,11 @@ -// popup.js -document.getElementById('add_checkboxes').addEventListener('click', () => { - chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { - chrome.tabs.sendMessage(tabs[0].id, { message: 'add_checkboxes' }); - }); +document.getElementById('add-checkboxes').addEventListener('click', () => { + chrome.tabs.executeScript({ file: 'addCheckboxes.js' }); }); - document.getElementById('delete_selected').addEventListener('click', () => { - chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { - chrome.tabs.sendMessage(tabs[0].id, { message: 'delete_selected_conversations' }); - }); - }); - - \ No newline at end of file +document.getElementById('bulk-delete').addEventListener('click', () => { + chrome.tabs.executeScript({ file: 'bulkDeleteConversations.js' }); +}); + +document.getElementById('remove-checkboxes').addEventListener('click', () => { + chrome.tabs.executeScript({ file: 'removeCheckboxes.js' }); +}); \ No newline at end of file diff --git a/removeCheckboxes.js b/removeCheckboxes.js new file mode 100644 index 0000000..7e06802 --- /dev/null +++ b/removeCheckboxes.js @@ -0,0 +1,7 @@ +(function() { + const removeConversationCheckboxes = document.querySelectorAll('.conversation-checkbox'); + removeConversationCheckboxes.forEach(checkbox => { + checkbox.remove(); + }); + })(); + \ No newline at end of file