Async Clipboard API için web özel biçimleri

Async Clipboard API, şimdiye kadar sistem panosuna kopyalanıp yapıştırılacak sınırlı sayıda MIME türünü destekliyordu. Özellikle: text/plain, text/html ve image/png. Tarayıcı, genellikle bu verileri temizleyerek örneğin, bir HTML dizesinden yerleştirilmiş script öğelerini veya javascript: bağlantılarını kaldırır ya da PNG sıkıştırma bombası saldırılarını önler.

Bununla birlikte, bazı durumlarda panodaki temizlenmemiş içeriğin desteklenmesi istenebilir:

  • Uygulamanın temizleme işlemini kendisinin yaptığı durumlar.
  • Kopyalanan verilerin yapıştırılan verilerle aynı olması gerektiği durumlar.

Bu tür durumlarda Async Clipboard API artık geliştiricilerin istenilen verileri panosuna yazmasına olanak tanıyan web özel biçimlerini destekliyor.

Tarayıcı desteği

Chromium 76'dan itibaren resim desteğiyle birlikte Asenkron Clipboard API desteklenmektedir. Async Clipboard API için web özel biçimleri, 104 sürümü itibarıyla masaüstü ve mobil Chromium'da desteklenmektedir.

Panoya web özel biçimleri yazılıyor

Web özel biçimlerini panoya yazmak, blob'un MIME türüne "web " dizesini (sonraki boşluk dahil) ekleme koşulu dışında ayıklanmış biçimleri yazmaya neredeyse aynıdır.

// Fetch remote JPEG and GIF images and obtain their blob representations.
const [jpegBlob, gifBlob] = await Promise.all([
  fetch('image.jpg').then((response) => response.blob()),
  fetch('image.gif').then((response) => response.blob()),
]);

try {
  // Write the image data to the clipboard, prepending the blobs' actual
  // types (`"image/jpeg"` and "image/gif") with the string `"web "`, so
  // they become `"web image/jpeg"` and `"web image/gif"` respectively.
  // The code elegantly makes use of computed property names:
  // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Object_initializer#computed_property_names.
  const clipboardItem = new ClipboardItem({
    [`web ${jpegBlob.type}`]: jpegBlob,
    [`web ${gifBlob.type}`]: gifBlob,
  });
  await navigator.clipboard.write([clipboardItem]);
} catch (err) {
  console.error(err.name, err.message);
}

Panodan web özel biçimleri okunuyor

Yazmada olduğu gibi, web'deki özel biçimleri panodan okumak, arındırılmış biçimleri okumak ile neredeyse aynıdır. Tek fark, uygulamanın artık türü "web " ile başlayan pano öğelerini araması gerektiğidir.

try {
  // Iterate over all clipboard items.
  const clipboardItems = await navigator.clipboard.read();
  for (const clipboardItem of clipboardItems) {
    for (const type of clipboardItem.types) {
      // Discard any types that are not web custom formats.
      if (!type.startsWith('web ')) {
        continue;
      }
      const blob = await clipboardItem.getType(type);
      // Sanitize the blob if you need to, then process it in your app.
    }
  }
} catch (err) {
  console.error(err.name, err.message);
}

Platforma özgü uygulamalarla birlikte çalışabilirlik

web image/jpeg gibi özel web biçimleri, platforma özgü tipik uygulamaların anlayabileceği bir şey değildir (image/jpeg biçimini beklerler). Geliştiricileri, özel web biçimleri desteğinin kullanıcıları için alakalı olduğunu düşünürse ilgili uygulamaların zaman içinde bu tür biçimler için etkinleştirilebilir destek eklemesi beklenir. İşletim sistemi panosundaki çeşitli biçimler, aşağıdaki macOS ekran görüntüsünde görüldüğü gibi kullanıma hazır birden fazla biçimde bulunur.

macOS'te iki web özel biçimini listeleyen özel biçim haritasını gösteren panosuna aktarıcı.

Demo

Demoyu deneyebilir ve nasıl çalıştığını görmek için kaynak kodunu görüntüleyebilirsiniz.

Teşekkür ederiz

Bu doküman Joe Medley ve François Beaufort tarafından incelendi.