1在Source/WebKit2/Shared/WebPreferencesDefinitions.h中增加一個宏,格式要和那文件裏已有的宏相一致.
如:macro(DoNotTrack,doNotTrack, Bool, bool, true) \
2在Source/WebCore/page/Settings.in中添加內容,設定初始值,依照下面的形式
如:doNotTrackinitial=false
該文件的改動會引起編譯時重新生成DerivedSources/WebCore目錄中的文件.
這兩步之後,就在內核的設置中增加了一個新的設置項.這些設置項就可以在Source/WebKit2/UIProcess/WebPreferences.h中使用了,該文件中的宏
#defineDECLARE_PREFERENCE_GETTER_AND_SETTERS(KeyUpper, KeyLower, TypeName,Type, DefaultValue) \
voidset##KeyUpper(const Type& value); \
TypeKeyLower() const;
讓Source/WebKit2/Shared/WebPreferencesDefinitions.h中的宏在WebPreferences中生效,相應的設置函數和取得相應的設置值的函數就可以在Source/WebKit2/UIProcess/API/gtk/WebKitSettings.cpp中使用了,
如:
得到doNotTrack設置值的priv->preferences->doNotTrack()和設置doNotTrack的priv->preferences->setDoNotTrack(enabled);
然後就可以在Source/WebKit2/UIProcess/API/gtk/WebKitSettings.h中添加相應的設置函數給應用層調用了.
3要讓設置值起作用,還需要在webpage這一層添加一個函數,格式是:
settings.setDoNotTrack(store.getBoolValueForKey(WebPreferencesKey::doNotTrackKey()));
4整個設置起作用的流程,函數的調用關係爲:
當界面進行設置,調用了Source/WebKit2/UIProcess/API/gtk/WebKitSettings.h中提供的設置函數時,如果設置值和WebPreferences裏的值不一致時,就會調用WebPreferences裏的設置函數.
voidwebkit_settings_set_enable_do_not_track(WebKitSettings* settings,gboolean enabled)
{
g_return_if_fail(WEBKIT_IS_SETTINGS(settings));
WebKitSettingsPrivate*priv = settings->priv;
boolcurrentValue = priv->preferences->doNotTrack();
if(currentValue == enabled)
return;
priv->preferences->setDoNotTrack(enabled);
g_object_notify(G_OBJECT(settings),"do-not-track");
}
當調用到priv->preferences->setDoNotTrack(enabled)函數設置一個新的布爾值時,會調用WebPreferences::updateBoolValueForKey進行bool數據更新,該函數會調用WebPreferences::update()函數,update()函數會調用到webPageProxy->preferencesDidChange(),webPageProxy是web進程中webPage結構的代理類.在webPageProxy->preferencesDidChange()函數中,會通過語句:
m_process->send(Messages::WebPage::PreferencesDidChange(preferencesStore()),m_pageID, m_isPerformingDOMPrintOperation ?IPC::DispatchMessageEvenWhenWaitingForSyncReply :0);來向webPage類發送信號,從而在該類的PreferencesDidChange中作相應的數值更新操作.
在webPage類中相關函數的調用爲:
首先會調用WebPage::preferencesDidChange()函數,在該函數中,會調用WebPage::updatePreferences()函數,在updatePreferences函數中完成相應的設置工作,通過上面添加的語句settings.setDoNotTrack(store.getBoolValueForKey(WebPreferencesKey::doNotTrackKey()));來完成設置.
整個添加代碼和函數調用的流程就是這樣,具體裏面的一些語句是如何生成的,以及這其中的各個類和這些類之間的關係,還需要繼續對WebKit原碼的研讀來做更深入的瞭解.