Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2660)

Unified Diff: ios/web/webui/url_data_manager_ios.cc

Issue 1110213002: Upstream most of the iOS WebUI support in ios/web/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ios/web/webui/url_data_manager_ios.cc
diff --git a/ios/web/webui/url_data_manager_ios.cc b/ios/web/webui/url_data_manager_ios.cc
new file mode 100644
index 0000000000000000000000000000000000000000..60483166410d772c97386ebd532b3165766326de
--- /dev/null
+++ b/ios/web/webui/url_data_manager_ios.cc
@@ -0,0 +1,132 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ios/web/webui/url_data_manager_ios.h"
+
+#include <vector>
+
+#include "base/bind.h"
+#include "base/lazy_instance.h"
+#include "base/memory/ref_counted_memory.h"
+#include "base/message_loop/message_loop.h"
+#include "base/strings/string_util.h"
+#include "base/synchronization/lock.h"
+#include "ios/web/public/browser_state.h"
+#include "ios/web/public/url_data_source_ios.h"
+#include "ios/web/public/web_thread.h"
+#include "ios/web/webui/url_data_manager_ios_backend.h"
+#include "ios/web/webui/url_data_source_ios_impl.h"
+#include "ios/web/webui/web_ui_ios_data_source_impl.h"
+
+namespace web {
+namespace {
+
+const char kURLDataManagerIOSKeyName[] = "url_data_manager";
+
+base::LazyInstance<base::Lock>::Leaky g_delete_lock = LAZY_INSTANCE_INITIALIZER;
+
+URLDataManagerIOS* GetFromBrowserState(BrowserState* browser_state) {
+ if (!browser_state->GetUserData(kURLDataManagerIOSKeyName)) {
+ browser_state->SetUserData(kURLDataManagerIOSKeyName,
+ new URLDataManagerIOS(browser_state));
+ }
+ return static_cast<URLDataManagerIOS*>(
+ browser_state->GetUserData(kURLDataManagerIOSKeyName));
+}
+
+} // namespace
+
+// static
+URLDataManagerIOS::URLDataSources* URLDataManagerIOS::data_sources_ = NULL;
+
+// static
+void URLDataManagerIOS::AddDataSourceOnIOThread(
+ BrowserState* browser_state,
+ scoped_refptr<URLDataSourceIOSImpl> data_source) {
+ DCHECK_CURRENTLY_ON_WEB_THREAD(web::WebThread::IO);
+ browser_state->GetURLDataManagerIOSBackendOnIOThread()->AddDataSource(
+ data_source.get());
+}
+
+URLDataManagerIOS::URLDataManagerIOS(BrowserState* browser_state)
+ : browser_state_(browser_state) {
+}
+
+URLDataManagerIOS::~URLDataManagerIOS() {
+}
+
+void URLDataManagerIOS::AddDataSource(URLDataSourceIOSImpl* source) {
+ DCHECK_CURRENTLY_ON_WEB_THREAD(web::WebThread::UI);
+ web::WebThread::PostTask(
+ web::WebThread::IO, FROM_HERE,
+ base::Bind(&AddDataSourceOnIOThread, base::Unretained(browser_state_),
+ make_scoped_refptr(source)));
+}
+
+// static
+void URLDataManagerIOS::DeleteDataSources() {
+ DCHECK_CURRENTLY_ON_WEB_THREAD(web::WebThread::UI);
+ URLDataSources sources;
+ {
+ base::AutoLock lock(g_delete_lock.Get());
+ if (!data_sources_)
+ return;
+ data_sources_->swap(sources);
+ }
+ for (size_t i = 0; i < sources.size(); ++i)
+ delete sources[i];
+}
+
+// static
+void URLDataManagerIOS::DeleteDataSource(
+ const URLDataSourceIOSImpl* data_source) {
+ // Invoked when a DataSource is no longer referenced and needs to be deleted.
+ if (web::WebThread::CurrentlyOn(web::WebThread::UI)) {
+ // We're on the UI thread, delete right away.
+ delete data_source;
+ return;
+ }
+
+ // We're not on the UI thread, add the DataSource to the list of DataSources
+ // to delete.
+ bool schedule_delete = false;
+ {
+ base::AutoLock lock(g_delete_lock.Get());
+ if (!data_sources_)
+ data_sources_ = new URLDataSources();
+ schedule_delete = data_sources_->empty();
+ data_sources_->push_back(data_source);
+ }
+ if (schedule_delete) {
+ // Schedule a task to delete the DataSource back on the UI thread.
+ web::WebThread::PostTask(web::WebThread::UI, FROM_HERE,
+ base::Bind(&URLDataManagerIOS::DeleteDataSources));
+ }
+}
+
+// static
+void URLDataManagerIOS::AddDataSource(BrowserState* browser_state,
+ URLDataSourceIOS* source) {
+ GetFromBrowserState(browser_state)
+ ->AddDataSource(new URLDataSourceIOSImpl(source->GetSource(), source));
+}
+
+// static
+void URLDataManagerIOS::AddWebUIIOSDataSource(BrowserState* browser_state,
+ WebUIIOSDataSource* source) {
+ WebUIIOSDataSourceImpl* impl = static_cast<WebUIIOSDataSourceImpl*>(source);
+ GetFromBrowserState(browser_state)->AddDataSource(impl);
+}
+
+// static
+bool URLDataManagerIOS::IsScheduledForDeletion(
+ const URLDataSourceIOSImpl* data_source) {
+ base::AutoLock lock(g_delete_lock.Get());
+ if (!data_sources_)
+ return false;
+ return std::find(data_sources_->begin(), data_sources_->end(), data_source) !=
+ data_sources_->end();
+}
+
+} // namespace web

Powered by Google App Engine
This is Rietveld 408576698