WebKit中一個設置項起作用的流程

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()和設置doNotTrackpriv->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()webPageProxyweb進程中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原碼的研讀來做更深入的瞭解.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章