বর্ণনা
থার্ড-পার্টি এক্সটেনশনগুলিতে MIME টাইপ স্ট্রিম পরিচালনা করতে chrome.mimeHandler API ব্যবহার করুন।
প্রাপ্যতা
প্রকাশ
এই এপিআইটি ব্যবহার করার জন্য ম্যানিফেস্টে নিম্নলিখিত কী-গুলো অবশ্যই ঘোষণা করতে হবে।
"mime_types_handler"ধারণা এবং ব্যবহার
ঐতিহাসিকভাবে, নির্দিষ্ট ধরনের ডকুমেন্ট পরিচালনা করে এমন থার্ড-পার্টি এক্সটেনশনগুলো (যেমন পিডিএফ ভিউয়ার) নেভিগেশন ধরতে এবং ব্যবহারকারীদের একটি এক্সটেনশন পেজে রিডাইরেক্ট করতে নেটওয়ার্ক রিকোয়েস্ট ইন্টারসেপশনের উপর নির্ভর করত। MIME হ্যান্ডলার হিসেবে রেজিস্টার করলে সেই পদ্ধতির বেশ কিছু সীমাবদ্ধতা এড়ানো যায়:
-
chrome-extension://URL দ্বারা প্রতিস্থাপিত না হয়ে মূল URL-টি অ্যাড্রেস বারে থেকে যায়। - আপনার এক্সটেনশনটি দ্বিতীয়বার নেটওয়ার্ক অনুরোধ না করে, ক্রোমের ইতিমধ্যে প্রাপ্ত প্রতিক্রিয়াটিই নিয়ে আসে। POST অনুরোধের মাধ্যমে বা একবার ব্যবহারযোগ্য URL থেকে পাঠানো ডকুমেন্টগুলো সঠিকভাবে কাজ করে।
- আপনার এক্সটেনশনটি
<embed>,<object>, বা<iframe>এলিমেন্টের মধ্যে লোড করা ডকুমেন্ট রেন্ডার করতে পারে। - এক্সটেনশনের সেটিংসে ব্যবহারকারীকে ম্যানুয়ালি "ফাইল ইউআরএল-এ অ্যাক্সেসের অনুমতি দিন" বিকল্পটি চালু না করেই লোকাল ফাইল (
file://ইউআরএল) কাজ করে।
MIME হ্যান্ডলার শুধুমাত্র সেইসব ডকুমেন্টের ক্ষেত্রে প্রযোজ্য যা একটি সম্পূর্ণ ফ্রেম জুড়ে থাকে: যেমন টপ-লেভেল নেভিগেশন এবং এমবেডেড ডকুমেন্ট। এগুলি কখনোই ইনলাইন সাবরিসোর্সের (যেমন <audio> , <img> , বা <video> এলিমেন্ট) ক্ষেত্রে প্রযোজ্য হয় না।
একটি হ্যান্ডলার নিবন্ধন করুন
আপনার এক্সটেনশনকে MIME হ্যান্ডলার হিসেবে রেজিস্টার করতে, ম্যানিফেস্টে "mime_types_handler" কী-টি ডিক্লেয়ার করুন। প্রতিটি এন্ট্রি একটি MIME টাইপকে সেই এক্সটেনশন পেজের সাথে ম্যাপ করে যা এটিকে রেন্ডার করে:
manifest.json:
{
"name": "My PDF Viewer",
...
"mime_types_handler": {
"application/pdf": {
"handler_url": "viewer.html",
"can_embed": true
}
},
...
}
<embed> , <object> , বা <iframe> এলিমেন্টের মধ্যে এমবেড করা ডকুমেন্টগুলোও হ্যান্ডেল করার জন্য "can_embed" কে ' true তে সেট করুন। এটি বাদ দিলে, আপনার হ্যান্ডলার শুধুমাত্র টপ-লেভেল নেভিগেশন গ্রহণ করবে। Chrome 151 সংস্করণ থেকে, পাবলিক হ্যান্ডলারের জন্য application/pdf ই একমাত্র উপলব্ধ MIME টাইপ; একটি অসমর্থিত MIME টাইপ ঘোষণা করলে একটি ইনস্টলেশন সতর্কতা দেখা দেয়।
যদি একাধিক ইনস্টল করা এক্সটেনশন একই MIME টাইপের জন্য রেজিস্টার করে, তবে সবচেয়ে সম্প্রতি ইনস্টল করা এক্সটেনশনটি এটি পরিচালনা করে। যদি সেই এক্সটেনশনটি আনইনস্টল করা হয়, তবে পূর্বে ইনস্টল করা হ্যান্ডলারটি আবার সক্রিয় হয়ে ওঠে।
স্ট্রিম তথ্য পুনরুদ্ধার করুন
যখন কোনো ব্যবহারকারী একটি নিবন্ধিত MIME টাইপের ডকুমেন্ট খোলে, তখন Chrome তার বিল্ট-ইন ভিউয়ারের পরিবর্তে আপনার হ্যান্ডলার পেজটি লোড করে। হ্যান্ডলার পেজ থেকে, একটি StreamInfo অবজেক্ট পাওয়ার জন্য getStreamInfo() কল করুন। এর মধ্যে অন্তর্ভুক্ত থাকে ব্যবহারকারীর নেভিগেট করা originalUrl , HTTP responseHeaders , ডকুমেন্টটি একটি embedded কনটেক্সটে লোড হয়েছে কিনা, এবং একটি streamUrl যা ডকুমেন্টের কন্টেন্ট ফেচ করতে ব্যবহার করা যেতে পারে।
streamUrl শুধুমাত্র একবার এবং কেবল আপনার এক্সটেনশনের অরিজিন থেকে ফেচ করা যাবে। রেসপন্সটি প্রসেস করার আগে সম্পূর্ণভাবে পড়ুন; একই streamUrl দ্বিতীয়বার ফেচ করলে তা ব্যর্থ হবে। ডকুমেন্টের অবস্থান বা শিরোনাম দেখানোর জন্য originalUrl ব্যবহার করুন, কন্টেন্ট ফেচ করার জন্য নয়, কারণ মূল রিকোয়েস্টটি পুনরাবৃত্তিযোগ্য নাও হতে পারে।
নেটিভ হ্যান্ডলারে ফিরে যান
আপনার হ্যান্ডলার এমন ডকুমেন্টের সম্মুখীন হতে পারে যা এটি রেন্ডার করতে পারে না, যেমন ত্রুটিপূর্ণ বা পাসওয়ার্ড-সুরক্ষিত ফাইল। ব্যবহারকারীকে একটি ত্রুটিপূর্ণ পৃষ্ঠায় আটকে না রেখে, ডকুমেন্টটির হ্যান্ডলিং বন্ধ করতে এবং এটিকে Chrome-এর বিল্ট-ইন ভিউয়ারে ফেরত পাঠাতে abortAndFallbackToNativeHandler() কল করুন। ফলব্যাকের অংশ হিসেবে Chrome আপনার হ্যান্ডলার পৃষ্ঠাটি আনলোড করে দেয়; এই কলের পরে কোনো কোড রান করে না।
আপনার হ্যান্ডলার চলার সময় ক্রোম রেসপন্সটি বাফার করে রাখে। আপনি যখন এই মেথডটি কল করেন, তখন যদি রেসপন্সটি সম্পূর্ণভাবে পাওয়া গিয়ে থাকে, তাহলে ক্রোম নতুন কোনো নেটওয়ার্ক রিকোয়েস্ট ছাড়াই বাফার করা কপি থেকে বিল্ট-ইন ভিউয়ারটি পরিবেশন করে। অন্যথায়, ক্রোম নেটওয়ার্ক থেকে ডকুমেন্টটি পুনরায় লোড করে, যা POST বা একবার ব্যবহারযোগ্য URL থেকে আসা ডকুমেন্টের ক্ষেত্রে ব্যর্থ হতে পারে। স্ট্রিমটি রেন্ডার করা যাবে কিনা, সেই সিদ্ধান্ত নেওয়ার আগে সম্পূর্ণ স্ট্রিমটি ফেচ করুন; একবার আপনার streamUrl ফেচ করা সম্পন্ন হলে, ক্রোমের কাছে সম্পূর্ণ রেসপন্সটি চলে আসে।
এপিআই প্রাপ্যতা পরিচালনা করুন
ক্রোম ১৫১-এর পূর্ববর্তী সংস্করণগুলিতে, "mime_types_handler" ঘোষণা করা একটি এক্সটেনশন ইনস্টল এবং রান করলেও, এটি হ্যান্ডলার হিসাবে নিবন্ধিত হয় না এবং chrome.mimeHandler অনির্ধারিত থাকে। নেটওয়ার্ক অনুরোধ ইন্টারসেপশন থেকে সরে আসা এক্সটেনশনগুলি স্টার্টআপের সময় এপিআই পরীক্ষা করতে পারে এবং ফলব্যাক হিসাবে তাদের বিদ্যমান পদ্ধতিটি রাখতে পারে:
service-worker.js:
if (chrome.mimeHandler) {
// Chrome routes registered MIME types to the handler page
// declared in the manifest.
} else {
// Fall back to network request interception.
}
উদাহরণ
একটি প্রবাহ পরিচালনা করুন
নিম্নলিখিত উদাহরণটি ম্যানিফেস্টে ঘোষিত হ্যান্ডলার পৃষ্ঠায় চলে। এটি ডকুমেন্টের বিষয়বস্তু সংগ্রহ করে এবং রেন্ডারিং ব্যর্থ হলে ক্রোমের অন্তর্নির্মিত ভিউয়ারে ফিরে যায়:
viewer.js:
async function loadDocument() {
const streamInfo = await chrome.mimeHandler.getStreamInfo();
// The `embedded` property is true if the document is loaded
// within an <embed>, <object>, or <iframe> element.
if (streamInfo.embedded) {
// Adjust the UI (e.g., hide the top navigation bar).
document.body.classList.add('embedded-view');
}
// Fetch the content using the provided streamUrl. The stream can
// only be consumed once, so read it fully before continuing.
const response = await fetch(streamInfo.streamUrl);
const data = await response.arrayBuffer();
try {
// Render the document (e.g., using PDF.js).
await renderDocument(data);
} catch (e) {
// Can't render this document. Fall back to Chrome's built-in
// viewer; the page unloads and no code runs after this call.
chrome.mimeHandler.abortAndFallbackToNativeHandler();
}
}
loadDocument();
ব্যবহারকারীদের হ্যান্ডলিং টগল করতে দিন
হ্যান্ডলার অপশনগুলো প্রতিটি MIME টাইপের জন্য সংরক্ষিত থাকে। নিচের উদাহরণটিতে getMimeHandlerOptions() এবং setMimeHandlerOptions() ব্যবহার করা হয়েছে, যাতে ব্যবহারকারীরা এক্সটেনশনটি আনইনস্টল না করেই অপশন পেজ থেকে হ্যান্ডলিং বন্ধ করতে পারেন। হ্যান্ডলিং নিষ্ক্রিয় থাকাকালীন, সেই ধরনের ডকুমেন্টগুলো আর আপনার এক্সটেনশনে পাঠানো হয় না।
options.js:
const checkbox = document.querySelector('#handle-pdfs');
async function initOptions() {
const options =
await chrome.mimeHandler.getMimeHandlerOptions('application/pdf');
// Handling is enabled unless it has been explicitly disabled.
checkbox.checked = options.enabled !== false;
}
checkbox.addEventListener('change', async () => {
await chrome.mimeHandler.setMimeHandlerOptions('application/pdf', {
enabled: checkbox.checked
});
});
initOptions();
প্রকারভেদ
MimeHandlerOptions
বৈশিষ্ট্য
- সক্ষম
বুলিয়ান
প্রদত্ত MIME টাইপের জন্য এই হ্যান্ডলারটি সক্রিয় কিনা।
StreamInfo
বৈশিষ্ট্য
- এমবেডেড
বুলিয়ান
এমবেডেড কনটেক্সটে (আইফ্রেম/এমবেড/অবজেক্ট) লোড করা হলে সত্য হবে।
- মাইমটাইপ
স্ট্রিং
আটক করা বিষয়বস্তুর MIME টাইপ।
- মূল ইউআরএল
স্ট্রিং
ব্যবহারকারী যে মূল ইউআরএলটিতে গিয়েছিলেন।
- প্রতিক্রিয়া হেডার
বস্তু
HTTP প্রতিক্রিয়া হেডারসমূহ কী-ভ্যালু জোড়া হিসেবে।
- স্ট্রিমইউআরএল
স্ট্রিং
যে URL থেকে স্ট্রিম ডেটা আনা হবে।
- ট্যাবআইডি
সংখ্যা
যে ট্যাব আইডিতে ডকুমেন্টটি রয়েছে।
পদ্ধতি
abortAndFallbackToNativeHandler()
chrome.mimeHandler.abortAndFallbackToNativeHandler(): Promise<void>
বর্তমান স্ট্রিম হ্যান্ডলিং বাতিল করে এবং কন্টেন্টটি ইউজার এজেন্টের নেটিভ হ্যান্ডলারের কাছে হস্তান্তর করে। এই কলের পর এক্সটেনশন ফ্রেমটি বন্ধ করে দেওয়া হবে; কলারদের আর কোনো এক্সিকিউশন আশা করা উচিত নয়।
ফেরত
প্রতিশ্রুতি<শূন্য>
getMimeHandlerOptions()
chrome.mimeHandler.getMimeHandlerOptions(
mimeType: string,
): Promise<MimeHandlerOptions>
একটি MIME টাইপের জন্য সংরক্ষিত অপশনগুলো পড়ে। যদি কোনো অপশন সংরক্ষিত না থাকে, তবে ডিফল্ট মান (enabled=true) ফেরত দেয়।
প্যারামিটার
- মাইমটাইপ
স্ট্রিং
যে MIME টাইপের অপশনগুলো পড়তে হবে।
ফেরত
প্রতিশ্রুতি< MimeHandlerOptions >
MIME টাইপের জন্য সংরক্ষিত অপশনগুলো সহ প্রমিসটি সমাধান করা হয়েছে।
getStreamInfo()
chrome.mimeHandler.getStreamInfo(): Promise<StreamInfo>
বর্তমান MIME হ্যান্ডলার কনটেক্সটের জন্য স্ট্রিম তথ্য পুনরুদ্ধার করে। এটিকে অবশ্যই একটি MIME হ্যান্ডলার এক্সটেনশন পেজের ভেতর থেকে কল করতে হবে।
ফেরত
প্রতিশ্রুতি< স্ট্রিমইনফো >
setMimeHandlerOptions()
chrome.mimeHandler.setMimeHandlerOptions(
mimeType: string,
options: MimeHandlerOptions,
): Promise<void>
একটি নির্দিষ্ট MIME টাইপের জন্য কনফিগারেশন অপশনগুলো নির্ধারণ করে।
প্যারামিটার
- মাইমটাইপ
স্ট্রিং
কনফিগার করার জন্য MIME টাইপ।
- বিকল্পগুলি
ব্যবহারের জন্য নতুন বিকল্পগুলো।
ফেরত
প্রতিশ্রুতি<শূন্য>
কনফিগারেশন সেট করা হলে প্রতিশ্রুতিটি সমাধান করা হবে।