Diff
Modified: branches/safari-537-branch/Source/WebKit2/ChangeLog (152273 => 152274)
--- branches/safari-537-branch/Source/WebKit2/ChangeLog 2013-07-02 00:08:56 UTC (rev 152273)
+++ branches/safari-537-branch/Source/WebKit2/ChangeLog 2013-07-02 00:45:59 UTC (rev 152274)
@@ -1,5 +1,49 @@
2013-07-01 Lucas Forschler <[email protected]>
+ Merge r152273
+
+ 2013-07-01 Alexey Proskuryakov <[email protected]>
+
+ Clean up private browsing session tracking
+ https://bugs.webkit.org/show_bug.cgi?id=118266
+ <rdar://problem/13078036>
+
+ Reviewed by Brady Eidson.
+
+ Instead of counting API calls, we now watch actual WebPreferences objects.
+
+ * UIProcess/API/C/WKPreferences.cpp: (WKPreferencesSetPrivateBrowsingEnabled):
+ Removed code that used to notify WebContext. It's now done by WebPreferences.
+
+ * UIProcess/WebContext.h:
+ * UIProcess/WebContext.cpp:
+ (WebKit::WebContext::ensureNetworkProcess): Instead of counting the number of times
+ API was called, rely on WebPreferences tracking.
+ (WebKit::WebContext::willStartUsingPrivateBrowsing): Ditto. This function is
+ now only called when we detect a change in private browsing state.
+ (WebKit::WebContext::willStopUsingPrivateBrowsing): Ditto.
+ (WebKit::WebContext::createNewWebProcess): Tell the new process to create a private
+ browsing session if needed.
+
+ * UIProcess/WebPreferences.h:
+ * UIProcess/WebPreferences.cpp:
+ (WebKit::WebPreferences::addPageGroup): Count how many page groups use private
+ browsing, and notify WebContext when a session is needed. Note that we don't notify
+ WebContext about WebPreferences without any page groups, because it's likely
+ that preferences will be updated by the client before groups are associated.
+ (WebKit::WebPreferences::removePageGroup): Ditto.
+ (WebKit::WebPreferences::updateBoolValueForKey): Perform special handling for
+ private browsing mode changes.
+ (WebKit::WebPreferences::updatePrivateBrowsingValue): Notify WebContext when
+ it's time to create or destroy a private browsing session.
+ (WebKit::WebPreferences::anyPageGroupsAreUsingPrivateBrowsing): A getter for
+ WebContext to know when any page groups are in private browsing mode.
+
+ * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::updatePreferences):
+ Don't create a private browsing session implicitly, UI process takes care of it.
+
+2013-07-01 Lucas Forschler <[email protected]>
+
Merge r152266
2013-07-01 Tim Horton <[email protected]>
Modified: branches/safari-537-branch/Source/WebKit2/UIProcess/API/C/WKPreferences.cpp (152273 => 152274)
--- branches/safari-537-branch/Source/WebKit2/UIProcess/API/C/WKPreferences.cpp 2013-07-02 00:08:56 UTC (rev 152273)
+++ branches/safari-537-branch/Source/WebKit2/UIProcess/API/C/WKPreferences.cpp 2013-07-02 00:45:59 UTC (rev 152274)
@@ -341,15 +341,6 @@
void WKPreferencesSetPrivateBrowsingEnabled(WKPreferencesRef preferencesRef, bool enabled)
{
- if (toImpl(preferencesRef)->privateBrowsingEnabled() == enabled)
- return;
-
- // Regardless of whether there are any open pages, we should tell WebContext, so that it could track browsing sessions.
- if (enabled)
- WebContext::willStartUsingPrivateBrowsing();
- else
- WebContext::willStopUsingPrivateBrowsing();
-
toImpl(preferencesRef)->setPrivateBrowsingEnabled(enabled);
}
Modified: branches/safari-537-branch/Source/WebKit2/UIProcess/WebContext.cpp (152273 => 152274)
--- branches/safari-537-branch/Source/WebKit2/UIProcess/WebContext.cpp 2013-07-02 00:08:56 UTC (rev 152273)
+++ branches/safari-537-branch/Source/WebKit2/UIProcess/WebContext.cpp 2013-07-02 00:45:59 UTC (rev 152274)
@@ -50,6 +50,7 @@
#include "WebNotificationManagerProxy.h"
#include "WebPluginSiteDataManager.h"
#include "WebPageGroup.h"
+#include "WebPreferences.h"
#include "WebMemorySampler.h"
#include "WebProcessCreationParameters.h"
#include "WebProcessMessages.h"
@@ -97,8 +98,6 @@
static const double sharedSecondaryProcessShutdownTimeout = 60;
-unsigned WebContext::m_privateBrowsingEnterCount;
-
DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, webContextCounter, ("WebContext"));
PassRefPtr<WebContext> WebContext::create(const String& injectedBundlePath)
@@ -373,10 +372,7 @@
if (!parameters.diskCacheDirectory.isEmpty())
SandboxExtension::createHandleForReadWriteDirectory(parameters.diskCacheDirectory, parameters.diskCacheDirectoryExtensionHandle);
- // FIXME: We don't account for private browsing mode being enabled due to a persistent preference in any of active page groups.
- // This means that clients must re-enable private browsing mode through API on each launch, not relying on preferences.
- // If the client does not re-enable private browsing on next launch, NetworkProcess will crash.
- parameters.privateBrowsingEnabled = m_privateBrowsingEnterCount;
+ parameters.privateBrowsingEnabled = WebPreferences::anyPageGroupsAreUsingPrivateBrowsing();
parameters.cacheModel = m_cacheModel;
@@ -416,9 +412,6 @@
void WebContext::willStartUsingPrivateBrowsing()
{
- if (m_privateBrowsingEnterCount++)
- return;
-
const Vector<WebContext*>& contexts = allContexts();
for (size_t i = 0, count = contexts.size(); i < count; ++i) {
#if ENABLE(NETWORK_PROCESS)
@@ -431,11 +424,6 @@
void WebContext::willStopUsingPrivateBrowsing()
{
- // If the client asks to disable private browsing without enabling it first, it may be resetting a persistent preference,
- // so it is still necessary to destroy any existing private browsing session.
- if (m_privateBrowsingEnterCount && --m_privateBrowsingEnterCount)
- return;
-
const Vector<WebContext*>& contexts = allContexts();
for (size_t i = 0, count = contexts.size(); i < count; ++i) {
#if ENABLE(NETWORK_PROCESS)
@@ -562,6 +550,9 @@
injectedBundleInitializationUserData = m_injectedBundleInitializationUserData;
process->send(Messages::WebProcess::InitializeWebProcess(parameters, WebContextUserMessageEncoder(injectedBundleInitializationUserData.get())), 0);
+ if (WebPreferences::anyPageGroupsAreUsingPrivateBrowsing())
+ process->send(Messages::WebProcess::EnsurePrivateBrowsingSession(), 0);
+
m_processes.append(process);
if (m_processModel == ProcessModelSharedSecondaryProcess) {
Modified: branches/safari-537-branch/Source/WebKit2/UIProcess/WebContext.h (152273 => 152274)
--- branches/safari-537-branch/Source/WebKit2/UIProcess/WebContext.h 2013-07-02 00:08:56 UTC (rev 152273)
+++ branches/safari-537-branch/Source/WebKit2/UIProcess/WebContext.h 2013-07-02 00:45:59 UTC (rev 152274)
@@ -422,10 +422,6 @@
bool m_alwaysUsesComplexTextCodePath;
bool m_shouldUseFontSmoothing;
- // How many times an API call was used to enable the preference.
- // The variable can be 0 when private browsing is used if it's enabled due to a persistent preference.
- static unsigned m_privateBrowsingEnterCount;
-
// Messages that were posted before any pages were created.
// The client should use initialization messages instead, so that a restarted process would get the same state.
Vector<pair<String, RefPtr<APIObject>>> m_messagesToInjectedBundlePostedToEmptyContext;
Modified: branches/safari-537-branch/Source/WebKit2/UIProcess/WebPreferences.cpp (152273 => 152274)
--- branches/safari-537-branch/Source/WebKit2/UIProcess/WebPreferences.cpp 2013-07-02 00:08:56 UTC (rev 152273)
+++ branches/safari-537-branch/Source/WebKit2/UIProcess/WebPreferences.cpp 2013-07-02 00:45:59 UTC (rev 152274)
@@ -26,10 +26,16 @@
#include "config.h"
#include "WebPreferences.h"
+#include "WebContext.h"
#include "WebPageGroup.h"
+#include <wtf/ThreadingPrimitives.h>
namespace WebKit {
+// FIXME: Manipulating this variable is not thread safe.
+// Instead of tracking private browsing state as a boolean preference, we should let the client provide storage sessions explicitly.
+static unsigned privateBrowsingPageGroupCount;
+
WebPreferences::WebPreferences()
{
platformInitializeStore();
@@ -49,16 +55,32 @@
WebPreferences::~WebPreferences()
{
+ ASSERT(m_pageGroups.isEmpty());
}
void WebPreferences::addPageGroup(WebPageGroup* pageGroup)
{
- m_pageGroups.add(pageGroup);
+ bool didAddPageGroup = m_pageGroups.add(pageGroup).isNewEntry;
+ if (didAddPageGroup && privateBrowsingEnabled()) {
+ if (!privateBrowsingPageGroupCount)
+ WebContext::willStartUsingPrivateBrowsing();
+ ++privateBrowsingPageGroupCount;
+ }
}
void WebPreferences::removePageGroup(WebPageGroup* pageGroup)
{
- m_pageGroups.remove(pageGroup);
+ HashSet<WebPageGroup*>::iterator iter = m_pageGroups.find(pageGroup);
+ if (iter == m_pageGroups.end())
+ return;
+
+ m_pageGroups.remove(iter);
+
+ if (privateBrowsingEnabled()) {
+ --privateBrowsingPageGroupCount;
+ if (!privateBrowsingPageGroupCount)
+ WebContext::willStopUsingPrivateBrowsing();
+ }
}
void WebPreferences::update()
@@ -75,6 +97,11 @@
void WebPreferences::updateBoolValueForKey(const String& key, bool value)
{
+ if (key == WebPreferencesKey::privateBrowsingEnabledKey()) {
+ updatePrivateBrowsingValue(value);
+ return;
+ }
+
platformUpdateBoolValueForKey(key, value);
update(); // FIXME: Only send over the changed key and value.
}
@@ -97,6 +124,30 @@
update(); // FIXME: Only send over the changed key and value.
}
+void WebPreferences::updatePrivateBrowsingValue(bool value)
+{
+ platformUpdateBoolValueForKey(WebPreferencesKey::privateBrowsingEnabledKey(), value);
+
+ unsigned pageGroupsChanged = m_pageGroups.size();
+ if (!pageGroupsChanged)
+ return;
+
+ if (value) {
+ if (!privateBrowsingPageGroupCount)
+ WebContext::willStartUsingPrivateBrowsing();
+ privateBrowsingPageGroupCount += pageGroupsChanged;
+ }
+
+ update(); // FIXME: Only send over the changed key and value.
+
+ if (!value) {
+ ASSERT(privateBrowsingPageGroupCount >= pageGroupsChanged);
+ privateBrowsingPageGroupCount -= pageGroupsChanged;
+ if (!privateBrowsingPageGroupCount)
+ WebContext::willStopUsingPrivateBrowsing();
+ }
+}
+
#define DEFINE_PREFERENCE_GETTER_AND_SETTERS(KeyUpper, KeyLower, TypeName, Type, DefaultValue) \
void WebPreferences::set##KeyUpper(const Type& value) \
{ \
@@ -115,4 +166,9 @@
#undef DEFINE_PREFERENCE_GETTER_AND_SETTERS
+bool WebPreferences::anyPageGroupsAreUsingPrivateBrowsing()
+{
+ return privateBrowsingPageGroupCount;
+}
+
} // namespace WebKit
Modified: branches/safari-537-branch/Source/WebKit2/UIProcess/WebPreferences.h (152273 => 152274)
--- branches/safari-537-branch/Source/WebKit2/UIProcess/WebPreferences.h 2013-07-02 00:08:56 UTC (rev 152273)
+++ branches/safari-537-branch/Source/WebKit2/UIProcess/WebPreferences.h 2013-07-02 00:45:59 UTC (rev 152274)
@@ -75,6 +75,8 @@
// Exposed for WebKitTestRunner use only.
void forceUpdate() { update(); }
+ static bool anyPageGroupsAreUsingPrivateBrowsing();
+
private:
WebPreferences();
explicit WebPreferences(const String&);
@@ -95,6 +97,8 @@
void platformUpdateDoubleValueForKey(const String& key, double value);
void platformUpdateFloatValueForKey(const String& key, float value);
+ void updatePrivateBrowsingValue(bool value);
+
HashSet<WebPageGroup*> m_pageGroups;
WebPreferencesStore m_store;
String m_identifier;
Modified: branches/safari-537-branch/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (152273 => 152274)
--- branches/safari-537-branch/Source/WebKit2/WebProcess/WebPage/WebPage.cpp 2013-07-02 00:08:56 UTC (rev 152273)
+++ branches/safari-537-branch/Source/WebKit2/WebProcess/WebPage/WebPage.cpp 2013-07-02 00:45:59 UTC (rev 152274)
@@ -2435,12 +2435,7 @@
settings->setLocalStorageEnabled(store.getBoolValueForKey(WebPreferencesKey::localStorageEnabledKey()));
settings->setXSSAuditorEnabled(store.getBoolValueForKey(WebPreferencesKey::xssAuditorEnabledKey()));
settings->setFrameFlatteningEnabled(store.getBoolValueForKey(WebPreferencesKey::frameFlatteningEnabledKey()));
-
- bool privateBrowsingEnabled = store.getBoolValueForKey(WebPreferencesKey::privateBrowsingEnabledKey());
- if (privateBrowsingEnabled)
- WebProcess::shared().ensurePrivateBrowsingSession();
- settings->setPrivateBrowsingEnabled(privateBrowsingEnabled);
-
+ settings->setPrivateBrowsingEnabled(store.getBoolValueForKey(WebPreferencesKey::privateBrowsingEnabledKey()));
settings->setDeveloperExtrasEnabled(store.getBoolValueForKey(WebPreferencesKey::developerExtrasEnabledKey()));
settings->setJavaScriptExperimentsEnabled(store.getBoolValueForKey(WebPreferencesKey::_javascript_ExperimentsEnabledKey()));
settings->setTextAreasAreResizable(store.getBoolValueForKey(WebPreferencesKey::textAreasAreResizableKey()));