Uzakta barındırılan kod (RHC), Chrome Web Mağazası'nın, uzantının kendi dosyaları dışında bir yerden yüklenen ve tarayıcı tarafından yürütülen her şeye verdiği addır. JavaScript ve WASM gibi şeyler. JSON veya CSS gibi verileri ya da öğeleri içermez.
Neden RHC'ye artık izin verilmiyor?
Manifest V3 ile birlikte uzantıların, kullandıkları tüm kodu uzantının içine paketlemesi gerekiyor. Geçmişte, web'deki herhangi bir URL'den komut dosyası etiketlerini dinamik olarak ekleyebiliyordunuz.
Uzantımın RHC'ye sahip olduğu söylendi. Neler oluyor?
Uzantınız inceleme sırasında Blue Argon hatasıyla reddedildiyse incelemecilerimiz, uzantınızın uzaktan barındırılan kod kullandığını düşünüyor. Bu durum genellikle bir uzantının uzak bir kaynakla (yani uzantıya dahil edilen dosyalar yerine açık web'den) bir komut dosyası etiketi eklemeye çalışmasından veya doğrudan yürütülecek bir kaynağı getirmesinden kaynaklanır.
RHC'yi nasıl tespit edebilirsiniz?
Ne arayacağınızı bildiğinizde RHC'yi tespit etmek zor değildir. Öncelikle projenizde "http://" veya "https://" dizelerini arayın. RHC ihlaliniz varsa bu ihlali bularak ilgili yorumları da bulabilirsiniz. Tam bir derleme sisteminiz varsa veya npm ya da diğer üçüncü taraf kaynaklarından bağımlılıklar kullanıyorsanız mağaza tarafından değerlendirilen sürüm derlenmiş kod olduğundan bu sürümde arama yaptığınızdan emin olun. Sorunu hâlâ bulamıyorsanız bir sonraki adım One Stop Support ile iletişime geçmektir. Bu kişiler, ihlalleri ve uzantının en kısa sürede yayınlanması için gerekenleri belirleyebilir.
Bir kütüphane kodu istiyorsa ne yapmalısınız?
Kodun kaynağı ne olursa olsun RHC'ye izin verilmez. Bu, sizin yazmadığınız ancak projenizde bağımlılık olarak kullandığınız kodları da içerir. Firebase'ı kullanan bazı geliştiriciler, Firebase Auth'ta kullanılmak üzere uzaktan kod eklendiğinde bu sorunla karşılaştı. Bu, birinci taraf (yani Google'a ait) bir kitaplık olsa da RHC için istisna yapılmaz. Kodu, RHC'yi kaldıracak veya projenizi başlangıçta kodu içermeyecek şekilde yapılandırmanız gerekir. RHC'yi yükleyen sizin kodunuz değil de kullandığınız bir kitaplık olduğunda en iyi çözüm, kitaplığın yazarıyla iletişime geçmektir. Bu durumun yaşandığını bildirin ve geçici bir çözüm veya kodu kaldıracak güncellemeler isteyin.
Kitaplık güncellemesini bekleyemiyorsanız ne yapabilirsiniz?
Bazı kitaplıklar, bildirildikten hemen sonra güncellemeyi yayınlar. Ancak diğerleri terk edilebilir veya sorunu gidermek zaman alabilir. İhlal nedenine bağlı olarak, engellemenin kaldırılması ve incelemenin başarıyla tamamlanması için bu ihlallerin taşınmasını beklemeniz gerekmeyebilir. Hızlıca tekrar çalışmaya başlamak için çeşitli seçenekler mevcuttur.
Kodu denetleme
İsteğe neden olan kodun gerekli olduğundan emin misiniz? Yalnızca silinebiliyorsa veya buna neden olan bir kitaplık kaldırılabiliyorsa kodu silin.
Alternatif olarak, aynı özellikleri sunan başka bir kitaplık var mı? Aynı kullanım alanlarını karşılayan diğer seçenekler için npmjs.com, GitHub veya diğer siteleri kontrol etmeyi deneyin.
Ağaçları sallama
RHC ihlaline neden olan kod aslında kullanılmıyorsa araçlar tarafından otomatik olarak silinebilir. webpack, Rollup ve Vite gibi modern derleme araçlarında (birkaç örnek vermek gerekirse) tree-shaking adı verilen bir özellik bulunur. Derleme sisteminizde etkinleştirildikten sonra tree shaking, kullanılmayan tüm kod yollarını kaldırmalıdır. Bu, kodunuzun yalnızca daha uyumlu bir sürümüne değil, daha yalın ve hızlı bir sürümüne de sahip olabileceğiniz anlamına gelir. Tüm kitaplıkların gereksiz kodlardan arındırılamadığını ancak çoğunun arındırılabildiğini unutmayın. Rollup ve Vite gibi bazı araçlarda tree-shaking varsayılan olarak etkindir. webpack'te bu özelliğin etkinleştirilmesi için yapılandırılması gerekir. Uzantınızın bir parçası olarak derleme sistemi kullanmıyorsanız ancak kod kitaplıkları kullanıyorsanız iş akışınıza bir derleme aracı eklemeyi araştırmanız önemle tavsiye edilir. Derleme araçları, daha güvenli, daha güvenilir ve daha sürdürülebilir projeler yazmanıza yardımcı olur.
Ağaç sallama işleminin nasıl uygulanacağı, projenize bağlıdır. Ancak Rollup ile basit bir örnek vermek gerekirse proje kodunuzu derleyerek ağaç sallama özelliğini ekleyebilirsiniz. Örneğin, yalnızca Firebase Auth'a giriş yapan bir dosyanız varsa (ör. main.js):
import { GoogleAuthProvider, initializeAuth } from "firebase/auth"; chrome.identity.getAuthToken({ 'interactive': true }, async (token) => { const credential = GoogleAuthProvider.credential(null, token); try { const app = initializeApp({ ... }); const auth = initializeAuth(app, { popupRedirectResolver: undefined, persistence: indexDBLocalPersistence }); const { user } = await auth.signInWithCredential(credential) console.log(user) } catch (e) { console.error(error); } });
Ardından, Rollup'a giriş dosyasını, düğüm dosyalarını yüklemek için gereken bir eklentiyi (@rollup/plugin-node-resolve) ve oluşturduğu çıkış dosyasının adını söylemeniz yeterlidir.
npx rollup --input main.js --plugin '@rollup/plugin-node-resolve' --file compiled.js
Bu komutu bir terminal penceresinde çalıştırdığınızda, main.js dosyamızın oluşturulmuş bir sürümünü alırsınız. Bu sürüm, compiled.js adlı tek bir dosyada derlenir.
Toplama işlemi basit olabilir ancak çok fazla yapılandırılabilir. Dokümanlarına göz atarak her türlü karmaşık mantık ve yapılandırma ekleyebilirsiniz. Bu tür bir derleme aracı eklemek daha küçük ve daha verimli bir kodla sonuçlanır. Bu durumda, uzaktan barındırılan kod sorunumuz düzeltilir.
Dosyaları otomatik olarak düzenleme
Uzakta barındırılan kodun kod tabanınıza girmesinin giderek yaygınlaşan bir yolu, dahil ettiğiniz bir kitaplığın alt bağımlılığı olarak girmesidir. Kitaplık X, CDN'den kitaplık import'yi Y yapmak istiyorsa yerel bir kaynaktan yüklenmesi için yine de güncellemeniz gerekir. Modern derleme sistemleriyle, uzaktan referans ayıklamak ve doğrudan kodunuza yerleştirmek için kolayca eklentiler oluşturabilirsiniz.
Bu durumda, aşağıdaki gibi görünen bir kod verildiğinde:
import moment from "https://unpkg.com/moment@2.29.4/moment.js" console.log(moment())
Küçük bir toplayıcı eklenti oluşturabilirsiniz.
import { existsSync } from 'fs'; import fetch from 'node-fetch'; export default { plugins: [{ load: async function transform(id, options, outputOptions) { // this code runs over all of out javascript, so we check every import // to see if it resolves as a local file, if that fails, we grab it from // the network using fetch, and return the contents of that file directly inline if (!existsSync(id)) { const response = await fetch(id); const code = await response.text(); return code } return null } }] };
Yeni eklentiyle derlemeyi çalıştırdıktan sonra, kodumuz, alt bağımlılık, alt-alt bağımlılık veya başka bir yerde olup olmadığına bakılmaksızın her uzak import URL'si keşfedilir.
npx rollup --input main.js --config ./rollup.config.mjs --file compiled.js
Dosyaları manuel olarak düzenleme
En basit seçenek, RHC'ye neden olan kodu silmektir. Tercih ettiğiniz metin düzenleyicide açın ve ihlalde bulunan satırları silin. Bu yöntem, kırılgan olduğu ve unutulabileceği için genellikle önerilmez. "library.min.js" adlı bir dosya gerçekte library.min.js olmadığında projenizi sürdürmek zorlaşır. Ham dosyaları düzenlemek yerine, biraz daha sürdürülebilir bir seçenek olarak patch-package gibi bir araç kullanabilirsiniz. Bu, dosyanın kendisi yerine dosyada yapılan değişiklikleri kaydetmenizi sağlayan son derece güçlü bir seçenektir. Yama dosyaları üzerine kurulmuştur. Bu dosyalar, Git veya Subversion gibi sürüm kontrol sistemlerine güç veren dosyalarla aynı türdendir. İhlal eden kodu manuel olarak değiştirmeniz, diff dosyasını kaydetmeniz ve patch-package'i uygulamak istediğiniz değişikliklerle yapılandırmanız yeterlidir. Projenin BENİOKU dosyasında eksiksiz bir eğitim okuyabilirsiniz. Bir projeyi yamalıyorsanız değişikliklerin yukarı akışta yapılmasını istemek için projeyle iletişime geçmenizi gerçekten öneririz. patch-package, yamaların yönetilmesini çok daha kolay hale getirse de yama gerektirmeyen bir durum daha iyidir.
Kod kullanılmıyorsa ne yapmalısınız?
Kod tabanları büyüdükçe bağımlılıklar (veya bir bağımlılığın bağımlılığı ya da bağımlılığın bağımlılığı…) artık kullanılmayan kod yollarını tutabilir. Bu bölümlerden birinde RHC'yi yükleme veya yürütme kodu varsa bu kodun kaldırılması gerekir. Ölü veya kullanılmayan cihazlar da dahil olmak üzere tüm cihazlar için geçerlidir. Kullanılmıyorsa ağaç sallama veya kitaplığı yamalayarak kaldırılmalıdır.
Herhangi bir geçici çözüm var mı?
Genel olarak hayır. RHC'ye izin verilmez. Ancak, bu özelliğin izin verildiği az sayıda durum vardır. Bu durumlar, neredeyse her zaman diğer seçeneklerin imkansız olduğu durumlardır.
User Scripts API
Kullanıcı komut dosyaları, genellikle kullanıcı tarafından sağlanan ve TamperMonkey ile Violentmonkey gibi kullanıcı komut dosyası yöneticileri için tasarlanmış küçük kod snippet'leridir. Bu yöneticilerin, kullanıcılar tarafından yazılan kodu paketlemesi mümkün değildir. Bu nedenle, Kullanıcı Komut Dosyası API'si, kullanıcı tarafından sağlanan kodu yürütmenin bir yolunu sunar. Bu, chrome.scripting.executeScript veya diğer kod yürütme ortamlarının yerine geçmez. Kullanıcıların herhangi bir şeyi yürütmek için geliştirici modunu etkinleştirmesi gerekir. Chrome Web Mağazası inceleme ekibi, bunun amaçlanandan farklı bir şekilde (ör. kullanıcı tarafından sağlanan kod) kullanıldığını düşünürse uzantı reddedilebilir veya mağazadaki listelemesi kaldırılabilir.
chrome.debugger
chrome.debugger API, uzantıların Chrome Geliştirici Araçları Protokolü ile etkileşime geçmesini sağlar. Bu, Chrome'un Geliştirici Araçları ve diğer birçok araçta kullanılan protokoldür. Bu sayede bir uzantı, uzaktan kod isteyebilir ve yürütebilir. Kullanıcı komut dosyaları gibi, chrome.scripting'in yerine geçmez ve çok daha dikkat çekici bir kullanıcı deneyimi sunar.
Kullanım sırasında pencerenin üst kısmında bir uyarı çubuğu gösterilir. Banner kapatılırsa veya kapatma düğmesi tıklanırsa hata ayıklama oturumu sonlandırılır.
Sandbox'a alınmış iframe'ler
Bir dizeyi kod olarak değerlendirmeniz gerekiyorsa ve DOM ortamındaysanız (ör. uzantı hizmeti çalışanı yerine içerik komut dosyası) korumalı alan iframe kullanabilirsiniz. Uzantılar, güvenlik önlemi olarak varsayılan durumda eval() gibi öğeleri desteklemez. Kötü amaçlı kodlar, kullanıcıların güvenliğini ve emniyetini riske atabilir. Ancak kod yalnızca bilinen güvenli bir ortamda (ör. web'in geri kalanından korumalı alan oluşturulmuş bir iFrame) yürütüldüğünde bu riskler büyük ölçüde azalır. Bu bağlamda, eval kullanımını engelleyen İçerik Güvenliği Politikası kaldırılabilir ve geçerli JavaScript kodlarını çalıştırmanıza olanak tanınır.
Kapsam dışı bir kullanım alanınız varsa geri bildirim almak için chromium-extensions posta listesini kullanarak ekibe ulaşabilir veya One Stop Support'tan rehberlik istemek için yeni bir destek kaydı açabilirsiniz.
Bir karara katılmıyorsanız ne yapmalısınız?
Politikaların uygulanması ayrıntılı bir süreç olabilir ve inceleme için manuel giriş gerekir. Bu nedenle, Chrome Web Mağazası ekibi bazen bir inceleme kararını değiştirmeyi kabul edebilir. İnceleme sırasında bir hata yapıldığını düşünüyorsanız One Stop Support'u kullanarak reddedilmeye itiraz edebilirsiniz.