2010-10-22 36 views
9

Tôi đang cố gắng chặn tệp tập lệnh tải trên trang web do người dùng xác định. Để chặn tệp tập lệnh, tôi đang sử dụng beforeload eventevent.preventDefault(); trong tập lệnh nội dung hoạt động tốt miễn là tôi đã biết danh sách trang web. Vấn đề của tôi là tôi không biết danh sách trang web trước, vì vậy để có được danh sách trang web tôi đang gửi một yêu cầu đến trang nền nhưng phản hồi là không đồng bộ và không sử dụng được.Truyền thông điệp đồng bộ trong tiện ích chrome?

Có bất kỳ đồng bộ thư nào trong phần mở rộng của Chrome mà tôi có thể bỏ qua trong tài liệu của Google không?

// my (simplified) code from content script: 
document.addEventListener("beforeload", function(event) 
{ 
    chrome.extension.sendRequest({fnc:"is_owner"}, function(response) 
    { 
    // asynchronous response is not usable because 
    // all scripts have already been loaded 
    if (response.is_owner) event.preventDefault(); 
    }); 
}, true); 
+1

Một [báo cáo sự cố khác] (https://code.google.com/p/chromium/issues/detail?id=135095&thanks=135095&ts=1340923674) của cùng một vấn đề –

Trả lời

6

Thật không may là không có. Có một số bug report mở về việc thiếu thông báo đồng bộ, có thể nếu có đủ người sao nó sẽ làm điều gì đó về nó.

+0

Cảm ơn bạn đã liên kết, tôi đã xem nó. –

+0

Sự cố hiện đã bị đóng dưới dạng WontFix :( – cprcrack

1

Bạn có thể sử dụng API tệp HTML5 (navigator.webkitTemporaryStorage hoặc cửa sổ không dùng nữa window.webkitStorageInfo với tùy chọn TEMPORARY) để lưu cài đặt vào tệp. Phần này là không đồng bộ nhưng bạn có thể làm điều đó từ nền hoặc trang tùy chọn hoặc cửa sổ bật lên của bạn. API này có thể thay đổi đối với bạn vì nó chưa được chuẩn hóa. Vì đó là lưu trữ tạm thời, trang nền của bạn có thể cần phải chạy liên tục để ngăn chrome xóa tệp.

Sau đó từ tập lệnh nội dung, bạn có thể sử dụng XMLHttpRequest đồng bộ để lấy tệp từ "filesystem:" + chrome.extension.getURL ("temporary /" + filename). Tiền tố "filesystem:" trên url khá quan trọng.

Đặt cược tốt nhất là sử dụng API chrome.storage (hoặc localStorage) cho cài đặt của bạn và móc sự kiện onChanged từ đó để cập nhật tệp tạm thời. Nếu bạn cần tải lại trang sau khi cài đặt thay đổi, bạn sẽ muốn thực hiện điều đó trong cuộc gọi lại từ thao tác ghi FileSystem để bạn biết rằng tập lệnh nội dung có thể thấy thay đổi.

Nó không yêu cầu bất kỳ quyền đặc biệt nào trong tệp kê khai. Cá nhân tôi đã thử nghiệm điều này trong chrome 35 nhưng tôi biết nó đã làm việc trong các phiên bản trước đó là tốt. Tuy nhiên, tôi không biết yêu cầu phiên bản tối thiểu. Tôi nhớ lại thấy một đề cập đến một sự hồi quy liên quan đến thay đổi an ninh trong chrome 33, nơi nó không hoạt động nhưng đã nhanh chóng được sửa.

Tôi đã xem một vài cách giải quyết khác (ví dụ: chuyển hướng đến url blob hoặc url dữ liệu từ onBeforeWebRequest) để nhận cài đặt thành tập lệnh nội dung trước khi tập lệnh của trang chạy nhưng theo như tôi có thể nói bị hỏng trong các phiên bản Chrome gần đây do các cải tiến bảo mật mở rộng và XSS chung.

+0

theo sự hiểu biết tốt nhất của bạn, đây có phải là giải pháp khả thi không? –

Các vấn đề liên quan