Genel Bakış
Geliştirici Araçları uzantısı, Chrome Geliştirici Araçları'na işlev ekler. Yeni kullanıcı arayüzü panelleri ve kenar çubukları ekleyebilir, incelenen sayfayla etkileşim kurabilir, ağ istekleri hakkında bilgi edinebilir ve daha fazlasını yapabilir. Öne çıkan DevTools uzantılarını görüntüleyin. Geliştirici Araçları uzantıları, Geliştirici Araçları'na özgü ek bir uzantı API'si grubuna erişebilir:
Geliştirici Araçları uzantıları diğer uzantılar gibi yapılandırılır: bir arka plan sayfası, içerik komut dosyaları ve diğer öğeler yer alır. Ayrıca her DevTools uzantısının, DevTools API'lerine erişebilen bir DevTools sayfası vardır.
Geliştirici Araçları sayfası
Her DevTools penceresi açıldığında uzantının DevTools sayfasının bir örneği oluşturulur. İlgili içeriği oluşturmak için kullanılan Geliştirici Araçları sayfası, Geliştirici Araçları penceresinin ömrü boyunca mevcuttur. Geliştirme Araçları sayfası, Geliştirme Araçları API'lerine ve sınırlı sayıda uzantı API'sine erişebilir. Geliştirici Araçları sayfasında özellikle şunlar yapılabilir:
devtools.panels
API'lerini kullanarak paneller oluşturun ve panellerle etkileşimde bulunun.devtools.inspectedWindow
API'lerini kullanarak incelenen pencere hakkında bilgi edinin ve incelenen penceredeki kodu değerlendirin.devtools.network
API'lerini kullanarak ağ istekleri hakkında bilgi edinin.
Geliştirici Araçları sayfası, uzantı API'lerinin çoğunu doğrudan kullanamaz. Aynı alt kümeye erişimi var
bir içerik komut dosyasının erişebildiği extension
ve runtime
API'lerinin sayısı. Bir içerik komut dosyası gibi, Geliştirici Araçları sayfası da Mesaj İletimi'ni kullanarak arka plan sayfasıyla iletişim kurabilir. Örneğin,
örnek için İçerik Komut Dosyası Yerleştirme konusuna bakın.
Geliştirici Araçları uzantısı oluşturma
Uzantınıza yönelik bir DevTools sayfası oluşturmak için uzantı manifest dosyasına devtools_page
alanını ekleyin:
{
"name": ...
"version": "1.0",
"minimum_chrome_version": "10.0",
"devtools_page": "devtools.html",
...
}
Uzantınızın manifest dosyasında belirtilen devtools_page
örneği şunun için oluşturulur:
Geliştirici Araçları penceresi açıldı. Sayfa, başka uzantı sayfalarını paneller ve kenar çubukları olarak
devtools.panels
API'yi kullanan Geliştirici Araçları penceresi
chrome.devtools.*
API modülleri yalnızca DevTools penceresinde yüklenen sayfalarda kullanılabilir. İçerik komut dosyaları ve diğer uzantı sayfalarında bu API'ler yoktur. Bu nedenle, API'ler
Yalnızca Geliştirici Araçları zaman aralığı boyunca kullanılabilir.
Hâlâ deneysel olan bazı DevTools API'leri de vardır. chrome.experimental.* API'leri inceleyin.
Geliştirici Araçları kullanıcı arayüzü öğeleri: paneller ve kenar çubuğu bölmeleri
DevTools uzantıları, tarayıcı işlemleri, bağlam menüleri ve pop-up'lar gibi normal uzantı kullanıcı arayüzü öğelerine ek olarak DevTools penceresine kullanıcı arayüzü öğeleri de ekleyebilir:
- Panel, Öğeler, Kaynaklar ve Ağ panelleri gibi üst düzey bir sekmedir.
- Kenar çubuğu bölmesi, bir panelle ilgili ek kullanıcı arayüzü sunar. Öğeler panelindeki Stiller, Hesaplanan Stiller ve Etkinlik Dinleyicileri bölmeleri, kenar çubuğu bölmelerine örnek gösterilebilir. ( Kenar çubuğu bölmelerinin görünümü, kullandığınız Chrome sürümüne bağlı olarak görselle eşleşmeyebilir geliştirici araçları penceresinin bulunduğu yere bakın.)
Her panel kendi HTML dosyasıdır ve bu dosya, diğer kaynakları (JavaScript, CSS, resimler vb.) açık). Temel bir panel oluşturma işlemi aşağıdaki gibi görünür:
chrome.devtools.panels.create("My Panel",
"MyPanelIcon.png",
"Panel.html",
function(panel) {
// code invoked on panel creation
}
);
Bir panelde veya kenar çubuğu bölmesinde çalıştırılan JavaScript, DevTools sayfasıyla aynı API'lere erişebilir.
Öğeler paneli için temel kenar çubuğu bölmesi şu şekilde görünür:
chrome.devtools.panels.elements.createSidebarPane("My Sidebar",
function(sidebar) {
// sidebar initialization code here
sidebar.setObject({ some_data: "Some data to show" });
});
İçeriği kenar çubuğu bölmesinde göstermenin birkaç yolu vardır:
- HTML içeriği. Panelde gösterilecek bir HTML sayfası belirtmek için
setPage
işlevini çağırın. - JSON verileri.
setObject
öğesine bir JSON nesnesi iletin. - JavaScript ifadesi.
setExpression
'a bir ifade gönderin. DevTools, ifadeyi incelenen sayfa bağlamında değerlendirir ve döndürülen değeri gösterir.
Hem setObject
hem de setExpression
için bölme, değeri
Geliştirici Araçları konsolu. Ancak setExpression
, DOM öğelerini ve rastgele JavaScript nesnelerini görüntülemenize olanak tanır. setObject
ise yalnızca JSON nesnelerini destekler.
Uzantı bileşenleri arasında iletişim kurma
Aşağıdaki bölümlerde farklı paydaşların arasındaki iletişimde kullanılan bazı tipik bileşenlerine göz atalım.
İçerik komut dosyası yerleştirme
Geliştirici Araçları sayfası, tabs.executeScript
öğesini doğrudan çağıramaz.
Geliştirici Araçları sayfasında, incelenen pencere sekmesinin kimliğini
inspectedWindow.tabId
özelliğini kullanıp arka plan sayfasına bir mesaj gönderin. Arka plan sayfasından komut dosyasını yerleştirmek için tabs.executeScript
işlevini çağırın.
Aşağıdaki kod snippet'lerinde, executeScript
kullanılarak içerik komut dosyasının nasıl ekleneceği gösterilmektedir.
// DevTools page -- devtools.js
// Create a connection to the background page
var backgroundPageConnection = chrome.runtime.connect({
name: "devtools-page"
});
backgroundPageConnection.onMessage.addListener(function (message) {
// Handle responses from the background page, if any
});
// Relay the tab ID to the background page
chrome.runtime.sendMessage({
tabId: chrome.devtools.inspectedWindow.tabId,
scriptToInject: "content_script.js"
});
Arka plan sayfasının kodu:
// Background page -- background.js
chrome.runtime.onConnect.addListener(function(devToolsConnection) {
// assign the listener function to a variable so we can remove it later
var devToolsListener = function(message, sender, sendResponse) {
// Inject a content script into the identified tab
chrome.tabs.executeScript(message.tabId,
{ file: message.scriptToInject });
}
// add the listener
devToolsConnection.onMessage.addListener(devToolsListener);
devToolsConnection.onDisconnect.addListener(function() {
devToolsConnection.onMessage.removeListener(devToolsListener);
});
});
İncelenen pencerede JavaScript'i değerlendirme
inspectedWindow.eval
yöntemini kullanarak JavaScript kodunu
incelenmiş sayfa. eval
yöntemini bir Geliştirici Araçları sayfasından, panelinden veya kenar çubuğu bölmesinden çağırabilirsiniz.
İfade varsayılan olarak sayfanın ana çerçevesi bağlamında değerlendirilir. Artık öğe inceleme (inspect(elem)
), işlevlerde durma (debug(fn)
), panoya kopyalama (copy()
) ve daha fazlası gibi DevTools komut satırı API özelliklerini biliyor olabilirsiniz.
inspectedWindow.eval()
, DevTools konsolunda yazılan kodla aynı komut dosyası yürütme bağlamını ve seçeneklerini kullanır. Bu, eval içinde bu API'lere erişmenize olanak tanır. Örneğin, SOAK bir öğeyi incelemek için bu özelliği kullanır:
chrome.devtools.inspectedWindow.eval(
"inspect($$('head script[data-soak=main]')[0])",
function(result, isException) { }
);
Alternatif olarak, inspectedWindow.eval()
için useContentScriptContext: true
seçeneğini kullanarak
İfadeyi, içerik komut dosyalarıyla aynı bağlamda değerlendirin. useContentScriptContext: true
ile eval
çağrıldığında içerik komut dosyası bağlamı oluşturulmaz. Bu nedenle, eval
çağrılmadan önce executeScript
çağrılarak veya manifest.json
dosyasında bir içerik komut dosyası belirtilerek bir bağlam komut dosyası yüklemeniz gerekir.
Bağlam komut dosyası oluşturulduktan sonra bu seçeneği kullanarak ek içerik komut dosyaları ekleyebilirsiniz.
eval
yöntemi, doğru bağlamda kullanıldığında güçlü, uygunsuz şekilde kullanıldığında tehlikelidir. İncelenen sayfanın JavaScript bağlamına erişmeniz gerekmiyorsa tabs.executeScript
yöntemini kullanın. Ayrıntılı uyarılar ve iki yöntemin karşılaştırması için inspectedWindow
başlıklı makaleyi inceleyin.
Seçili öğeyi bir içerik komut dosyasına iletme
İçerik komut dosyasının, seçili geçerli öğeye doğrudan erişimi yok. Ancak inspectedWindow.eval
kullanarak yürüttüğünüz tüm kodlar, Geliştirici Araçları Konsolu'na ve komut satırı API'lerine erişebilir.
Örneğin, değerlendirilen kodda seçili öğeye erişmek için $0
kullanabilirsiniz.
Seçilen öğeyi bir içerik komut dosyasına iletmek için:
- İçerik komut dosyasında, seçilen öğeyi bağımsız değişken olarak alan bir yöntem oluşturun.
useContentScriptContext: true
seçeneğiyleinspectedWindow.eval
kullanarak yöntemi Geliştirici Araçları sayfasından çağırın.
İçerik komut dosyanızdaki kod aşağıdaki gibi görünebilir:
function setSelectedElement(el) {
// do something with the selected element
}
Geliştirici Araçları sayfasından yöntemi şu şekilde çağırın:
chrome.devtools.inspectedWindow.eval("setSelectedElement($0)",
{ useContentScriptContext: true });
useContentScriptContext: true
seçeneği, ifadenin setSelectedElement
yöntemine erişebilmesi için içerik komut dosyalarıyla aynı bağlamda değerlendirilmesi gerektiğini belirtir.
Referans panelinin window
değerini alma
Geliştirici Araçları panelinden postMessage
işlemi yapmak için window
nesnesine referans vermeniz gerekir.
panel.onShown
etkinlik işleyicisinden bir panelin iframe penceresini alın:
onShown.addListener(function callback)
extensionPanel.onShown.addListener(function (extPanelWindow) {
extPanelWindow instanceof Window; // true
extPanelWindow.postMessage( // …
});
İçerik komut dosyalarından Geliştirici Araçları sayfasına gönderilen mesajlar
Geliştirici Araçları sayfası ile içerik komut dosyaları arasındaki mesajlar, arka plan sayfasından dolaylı olarak gerçekleşir.
Bir içerik komut dosyasına ileti gönderirken arka plan sayfası
tabs.sendMessage
yöntemini kullanıyorsanız, iletiyi belirli bir sekmedeki içerik komut dosyalarına yönlendirir,
(İçerik Komut Dosyası Yerleştirme bölümünde gösterildiği gibi) seçin.
Bir içerik komut dosyasından gönderilen mesajlar, geçerli sekmeyle ilişkili doğru DevTools sayfası örneğine hazır bir yöntemle iletilemez. Geçici bir çözüm olarak, DevTools sayfasının arka plan sayfasıyla uzun süreli bir bağlantı kurmasını ve arka plan sayfasının her mesajı doğru bağlantıya yönlendirebilmesi için bağlantılara ait sekme kimliklerinin bir haritasını tutmasını sağlayabilirsiniz.
// background.js
var connections = {};
chrome.runtime.onConnect.addListener(function (port) {
var extensionListener = function (message, sender, sendResponse) {
// The original connection event doesn't include the tab ID of the
// DevTools page, so we need to send it explicitly.
if (message.name == "init") {
connections[message.tabId] = port;
return;
}
// other message handling
}
// Listen to messages sent from the DevTools page
port.onMessage.addListener(extensionListener);
port.onDisconnect.addListener(function(port) {
port.onMessage.removeListener(extensionListener);
var tabs = Object.keys(connections);
for (var i=0, len=tabs.length; i < len; i++) {
if (connections[tabs[i]] == port) {
delete connections[tabs[i]]
break;
}
}
});
});
// Receive message from content script and relay to the devTools page for the
// current tab
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
// Messages from content scripts should have sender.tab set
if (sender.tab) {
var tabId = sender.tab.id;
if (tabId in connections) {
connections[tabId].postMessage(request);
} else {
console.log("Tab not found in connection list.");
}
} else {
console.log("sender.tab not defined.");
}
return true;
});
Geliştirici Araçları sayfası (veya panel ya da kenar çubuğu bölmesi) bağlantıyı şu şekilde oluşturur:
// Create a connection to the background page
var backgroundPageConnection = chrome.runtime.connect({
name: "panel"
});
backgroundPageConnection.postMessage({
name: 'init',
tabId: chrome.devtools.inspectedWindow.tabId
});
Yerleştirilen komut dosyalarından Geliştirici Araçları sayfasına gönderilen mesajlar
Yukarıdaki çözüm içerik komut dosyalarında işe yarar. Ancak doğrudan sayfaya yerleştirilen kod
(ör. bir <script>
etiketi ekleyerek veya inspectedWindow.eval
aracılığıyla)
farklı bir strateji. Bu bağlamda, runtime.sendMessage
iletileri
arka plan komut dosyasını beklendiği gibi yükleyin.
Geçici bir çözüm olarak, yerleştirilen komut dosyanızı
üçüncü taraf bir platformdur. Mesajları içerik komut dosyasına iletmek için window.postMessage
kullanabilirsiniz
API'ye gidin. Aşağıda, önceki bölümdeki arka plan komut dosyasının kullanıldığı bir örnek verilmiştir:
// injected-script.js
window.postMessage({
greeting: 'hello there!',
source: 'my-devtools-extension'
}, '*');
// content-script.js
window.addEventListener('message', function(event) {
// Only accept messages from the same frame
if (event.source !== window) {
return;
}
var message = event.data;
// Only accept messages that we know are ours
if (typeof message !== 'object' || message === null ||
!message.source === 'my-devtools-extension') {
return;
}
chrome.runtime.sendMessage(message);
});
Mesajınız artık enjekte edilen komut dosyasından içerik komut dosyasına, arka plan komut dosyasına ve son olarak DevTools sayfasına aktarılır.
Burada iki alternatif mesaj aktarma tekniğini de inceleyebilirsiniz.
DevTools'un ne zaman açıldığını ve kapandığını algılama
Uzantınızın, Geliştirici Araçları penceresinin açık olup olmadığını izlemesi gerekiyorsa bir onConnect ekleyebilirsiniz dinleyicinize ekleyebilir ve Geliştirici Araçları sayfasından connect yöntemini çağırabilirsiniz. Her sekme Geliştirici Araçları penceresi açıksa birden fazla bağlantı etkinliği alabilirsiniz. Herhangi bir Geliştirici Araçları penceresi açık. Bağlantı ve bağlantı kesme etkinliklerini aşağıda gösterildiği gibi saymanız gerekir:
// background.js
var openCount = 0;
chrome.runtime.onConnect.addListener(function (port) {
if (port.name == "devtools-page") {
if (openCount == 0) {
alert("DevTools window opening.");
}
openCount++;
port.onDisconnect.addListener(function(port) {
openCount--;
if (openCount == 0) {
alert("Last DevTools window closing.");
}
});
}
});
Geliştirici Araçları sayfası aşağıdaki gibi bir bağlantı oluşturur:
// devtools.js
// Create a connection to the background page
var backgroundPageConnection = chrome.runtime.connect({
name: "devtools-page"
});
DevTools uzantısı örnekleri
Aşağıdaki Geliştirici Araçları uzantısı örneklerinin kaynağına göz atın:
- Polymer Devtools Uzantısı: DOM/JS'yi sorgulamak için ana makine sayfasında çalışan birçok yardımcı kullanır durum değerini seçin.
- React Geliştirici Araçları Uzantısı: Geliştirici Araçları kullanıcı arayüzü bileşenlerini yeniden kullanmak için Blink'in bir alt modülünü kullanır.
- Ember Inspector: Hem Chrome hem de Firefox için adaptörlere sahip paylaşılan uzantı çekirdeği.
- Coquette-inspect - ana makine sayfası.
- Geliştirici Araçları Uzantısı Galerisi ve Örnek Uzantıları'nda, yükleyip denemeniz ve bilgi edinmeniz için daha değerli uygulamalar vardır.
Daha fazla bilgi
Uzantıların kullanabileceği standart API'ler hakkında bilgi edinmek için chrome.* API'ler ve web API'ler.
Geri bildirimlerinizi bizimle paylaşın. Yorumlarınız ve önerileriniz API'leri iyileştirmemize yardımcı olacaktır.
Örnekler
Geliştirici Araçları API'lerini kullanan örnekleri Örnekler bölümünde bulabilirsiniz.