Mô tả
Sử dụng API userScripts
để thực thi tập lệnh của người dùng trong ngữ cảnh Tập lệnh của người dùng.
Quyền
userScripts
Để sử dụng API chrome.userScripts
, hãy thêm quyền "userScripts"
vào manifest.json và "host_permissions"
cho các trang web mà bạn muốn chạy tập lệnh.
{
"name": "User script test extension",
"manifest_version": 3,
"minimum_chrome_version": "120",
"permissions": [
"userScripts"
],
"host_permissions": [
"*://example.com/*"
]
}
Phạm vi cung cấp
Khái niệm và cách sử dụng
Tập lệnh người dùng là một đoạn mã được chèn vào trang web để sửa đổi giao diện hoặc hành vi của trang web đó. Tập lệnh do người dùng tạo hoặc tải xuống từ kho lưu trữ tập lệnh hoặc tiện ích tập lệnh của người dùng.
Chế độ nhà phát triển dành cho người dùng tiện ích
Là nhà phát triển tiện ích, bạn đã bật Chế độ nhà phát triển trong quá trình cài đặt Chrome. Đối với tiện ích tập lệnh của người dùng, người dùng cũng cần bật chế độ nhà phát triển. Dưới đây là hướng dẫn mà bạn có thể sao chép và dán vào tài liệu của riêng mình.
- Chuyển đến trang Tiện ích bằng cách nhập
chrome://extensions
trong một thẻ mới. (Theo thiết kế, bạn không thể liên kết các URLchrome://
.) Bật Chế độ nhà phát triển bằng cách nhấp vào nút bật/tắt bên cạnh Chế độ nhà phát triển.
Bạn có thể xác định xem chế độ nhà phát triển đã được bật hay chưa bằng cách kiểm tra xem chrome.userScripts
có gửi lỗi hay không. Ví dụ:
function isUserScriptsAvailable() {
try {
// Property access which throws if developer mode is not enabled.
chrome.userScripts;
return true;
} catch {
// Not available.
return false;
}
}
Làm việc trong các thế giới riêng biệt
Cả tập lệnh người dùng và tập lệnh nội dung đều có thể chạy trong một thế giới riêng biệt hoặc trong thế giới chính. Một thế giới riêng biệt là một môi trường thực thi mà trang lưu trữ hoặc các tiện ích khác không thể truy cập. Điều này cho phép tập lệnh của người dùng thay đổi môi trường JavaScript mà không ảnh hưởng đến trang lưu trữ hoặc tập lệnh nội dung và người dùng của các tiện ích khác. Ngược lại, trang lưu trữ hoặc tập lệnh người dùng và tập lệnh nội dung của các tiện ích khác sẽ không thấy tập lệnh người dùng (và tập lệnh nội dung). Các tập lệnh chạy trong thế giới chính có thể truy cập vào các trang lưu trữ và các tiện ích khác, đồng thời hiển thị với các trang lưu trữ và các tiện ích khác. Để chọn thế giới, hãy truyền "USER_SCRIPT"
hoặc "MAIN"
khi gọi userScripts.register()
.
Để định cấu hình chính sách bảo mật nội dung cho thế giới USER_SCRIPT
, hãy gọi userScripts.configureWorld()
:
chrome.userScripts.configureWorld({
csp: "script-src 'self'"
});
Nhắn tin
Giống như tập lệnh nội dung và tài liệu ngoài màn hình, tập lệnh người dùng giao tiếp với các phần khác của tiện ích bằng cách sử dụng thông báo (nghĩa là chúng có thể gọi runtime.sendMessage()
và runtime.connect()
như bất kỳ phần nào khác của tiện ích). Tuy nhiên, các sự kiện này được nhận bằng trình xử lý sự kiện chuyên dụng (nghĩa là không sử dụng onMessage
hoặc onConnect
). Các trình xử lý này được gọi là runtime.onUserScriptMessage
và runtime.onUserScriptConnect
. Trình xử lý chuyên dụng giúp dễ dàng xác định thông báo từ tập lệnh của người dùng, đây là một ngữ cảnh ít đáng tin cậy hơn.
Trước khi gửi thông báo, bạn phải gọi configureWorld()
với đối số messaging
được đặt thành true
. Xin lưu ý rằng bạn có thể truyền cả đối số csp
và messaging
cùng một lúc.
chrome.userScripts.configureWorld({
messaging: true
});
Nội dung cập nhật về tiện ích
Các tập lệnh của người dùng sẽ bị xoá khi một tiện ích cập nhật. Bạn có thể thêm lại các trình xử lý đó bằng cách chạy mã trong trình xử lý sự kiện runtime.onInstalled
trong worker dịch vụ tiện ích. Chỉ phản hồi lý do "update"
được truyền đến lệnh gọi lại sự kiện.
Ví dụ:
Ví dụ này được lấy từ mẫu userScript trong kho lưu trữ mẫu của chúng tôi.
Đăng ký tập lệnh
Ví dụ sau đây cho thấy một lệnh gọi cơ bản đến register()
. Đối số đầu tiên là một mảng các đối tượng xác định các tập lệnh cần đăng ký. Có nhiều tuỳ chọn hơn những tuỳ chọn được hiển thị ở đây.
chrome.userScripts.register([{
id: 'test',
matches: ['*://*/*'],
js: [{code: 'alert("Hi!")'}]
}]);
Loại
ExecutionWorld
Môi trường JavaScript để tập lệnh của người dùng thực thi.
Enum
"MAIN"
Chỉ định môi trường thực thi của DOM, đây là môi trường thực thi được chia sẻ với JavaScript của trang lưu trữ.
"USER_SCRIPT"
Chỉ định môi trường thực thi dành riêng cho tập lệnh của người dùng và được miễn trừ khỏi CSP của trang.
RegisteredUserScript
Thuộc tính
-
allFrames
boolean không bắt buộc
Nếu đúng, thuộc tính này sẽ chèn vào tất cả các khung, ngay cả khi khung đó không phải là khung trên cùng trong thẻ. Mỗi khung được kiểm tra độc lập theo các yêu cầu về URL; khung sẽ không chèn vào khung con nếu không đáp ứng các yêu cầu về URL. Mặc định là false, nghĩa là chỉ khớp khung trên cùng.
-
excludeGlobs
string[] không bắt buộc
Chỉ định mẫu ký tự đại diện cho các trang mà tập lệnh người dùng này KHÔNG được chèn vào.
-
excludeMatches
string[] không bắt buộc
Loại trừ các trang mà tập lệnh người dùng này sẽ được chèn vào. Hãy xem phần Mẫu khớp để biết thêm thông tin chi tiết về cú pháp của các chuỗi này.
-
id
chuỗi
Mã của tập lệnh người dùng được chỉ định trong lệnh gọi API. Thuộc tính này không được bắt đầu bằng "_" vì thuộc tính này được đặt trước làm tiền tố cho mã nhận dạng tập lệnh được tạo.
-
includeGlobs
string[] không bắt buộc
Chỉ định mẫu ký tự đại diện cho các trang mà tập lệnh người dùng này sẽ được chèn vào.
-
js
ScriptSource[] không bắt buộc
Danh sách các đối tượng ScriptSource xác định nguồn của tập lệnh cần chèn vào các trang trùng khớp. Bạn phải chỉ định thuộc tính này cho ${ref:register} và khi chỉ định, thuộc tính này phải là một mảng không trống.
-
khớp với
string[] không bắt buộc
Chỉ định những trang mà tập lệnh người dùng này sẽ được chèn vào. Hãy xem phần Mẫu khớp để biết thêm thông tin chi tiết về cú pháp của các chuỗi này. Bạn phải chỉ định thuộc tính này cho ${ref:register}.
-
runAt
RunAt không bắt buộc
Chỉ định thời điểm chèn tệp JavaScript vào trang web. Giá trị ưu tiên và mặc định là
document_idle
. -
thế giới
ExecutionWorld không bắt buộc
Môi trường thực thi JavaScript để chạy tập lệnh. Mặc định là
`USER_SCRIPT`
.
ScriptSource
Thuộc tính
-
mã
chuỗi không bắt buộc
Một chuỗi chứa mã JavaScript cần chèn. Bạn phải chỉ định đúng một trong hai thuộc tính
file
hoặccode
. -
tệp
chuỗi không bắt buộc
Đường dẫn của tệp JavaScript cần chèn so với thư mục gốc của tiện ích. Bạn phải chỉ định đúng một trong hai thuộc tính
file
hoặccode
.
UserScriptFilter
Thuộc tính
-
mã nhận dạng
string[] không bắt buộc
getScripts
chỉ trả về các tập lệnh có mã nhận dạng được chỉ định trong danh sách này.
WorldProperties
Thuộc tính
-
csp
chuỗi không bắt buộc
Chỉ định csp thế giới. Giá trị mặc định là csp thế giới
`ISOLATED`
. -
nhắn tin
boolean không bắt buộc
Chỉ định xem có hiển thị API nhắn tin hay không. Mặc định là
false
.
Phương thức
configureWorld()
chrome.userScripts.configureWorld(
properties: WorldProperties,
callback?: function,
)
Định cấu hình môi trường thực thi `USER_SCRIPT`
.
Tham số
-
các tài sản
Chứa cấu hình thế giới tập lệnh của người dùng.
-
lệnh gọi lại
hàm không bắt buộc
Tham số
callback
có dạng như sau:() => void
Giá trị trả về
-
Promise<void>
Lời hứa được hỗ trợ trong Tệp kê khai V3 trở lên, nhưng lệnh gọi lại được cung cấp để đảm bảo khả năng tương thích ngược. Bạn không thể sử dụng cả hai trong cùng một lệnh gọi hàm. Lời hứa sẽ phân giải bằng cùng một loại được truyền đến lệnh gọi lại.
getScripts()
chrome.userScripts.getScripts(
filter?: UserScriptFilter,
callback?: function,
)
Trả về tất cả tập lệnh người dùng được đăng ký động cho tiện ích này.
Tham số
-
filter
UserScriptFilter không bắt buộc
Nếu được chỉ định, phương thức này chỉ trả về các tập lệnh người dùng khớp với tập lệnh đó.
-
lệnh gọi lại
hàm không bắt buộc
Tham số
callback
có dạng như sau:(scripts: RegisteredUserScript[]) => void
-
các tập lệnh
-
Giá trị trả về
-
Promise<RegisteredUserScript[]>
Lời hứa được hỗ trợ trong Tệp kê khai V3 trở lên, nhưng lệnh gọi lại được cung cấp để đảm bảo khả năng tương thích ngược. Bạn không thể sử dụng cả hai trong cùng một lệnh gọi hàm. Lời hứa sẽ phân giải bằng cùng một loại được truyền đến lệnh gọi lại.
register()
chrome.userScripts.register(
scripts: RegisteredUserScript[],
callback?: function,
)
Đăng ký một hoặc nhiều tập lệnh người dùng cho tiện ích này.
Tham số
-
các tập lệnh
Chứa danh sách tập lệnh người dùng cần đăng ký.
-
lệnh gọi lại
hàm không bắt buộc
Tham số
callback
có dạng như sau:() => void
Giá trị trả về
-
Promise<void>
Lời hứa được hỗ trợ trong Tệp kê khai V3 trở lên, nhưng lệnh gọi lại được cung cấp để đảm bảo khả năng tương thích ngược. Bạn không thể sử dụng cả hai trong cùng một lệnh gọi hàm. Lời hứa sẽ phân giải bằng cùng một loại được truyền đến lệnh gọi lại.
unregister()
chrome.userScripts.unregister(
filter?: UserScriptFilter,
callback?: function,
)
Huỷ đăng ký tất cả tập lệnh người dùng được đăng ký động cho tiện ích này.
Tham số
-
filter
UserScriptFilter không bắt buộc
Nếu được chỉ định, phương thức này sẽ chỉ huỷ đăng ký các tập lệnh người dùng khớp với phương thức đó.
-
lệnh gọi lại
hàm không bắt buộc
Tham số
callback
có dạng như sau:() => void
Giá trị trả về
-
Promise<void>
Lời hứa được hỗ trợ trong Tệp kê khai V3 trở lên, nhưng lệnh gọi lại được cung cấp để đảm bảo khả năng tương thích ngược. Bạn không thể sử dụng cả hai trong cùng một lệnh gọi hàm. Lời hứa sẽ phân giải bằng cùng một loại được truyền đến lệnh gọi lại.
update()
chrome.userScripts.update(
scripts: RegisteredUserScript[],
callback?: function,
)
Cập nhật một hoặc nhiều tập lệnh người dùng cho tiện ích này.
Tham số
-
các tập lệnh
Chứa danh sách tập lệnh người dùng cần cập nhật. Một thuộc tính chỉ được cập nhật cho tập lệnh hiện có nếu thuộc tính đó được chỉ định trong đối tượng này. Nếu có lỗi trong quá trình phân tích cú pháp tập lệnh/xác thực tệp hoặc nếu mã nhận dạng được chỉ định không tương ứng với một tập lệnh đã đăng ký đầy đủ, thì không có tập lệnh nào được cập nhật.
-
lệnh gọi lại
hàm không bắt buộc
Tham số
callback
có dạng như sau:() => void
Giá trị trả về
-
Promise<void>
Lời hứa được hỗ trợ trong Tệp kê khai V3 trở lên, nhưng lệnh gọi lại được cung cấp để đảm bảo khả năng tương thích ngược. Bạn không thể sử dụng cả hai trong cùng một lệnh gọi hàm. Lời hứa sẽ phân giải bằng cùng một loại được truyền đến lệnh gọi lại.