diff options
-rw-r--r-- | src/core/core_gyp_generator.pro | 2 | ||||
-rw-r--r-- | src/core/qtwebengine.gypi | 8 | ||||
-rw-r--r-- | src/core/renderer/content_renderer_client_qt.cpp | 25 | ||||
-rw-r--r-- | src/core/renderer/content_renderer_client_qt.h | 14 | ||||
-rw-r--r-- | src/core/web_contents_delegate_qt.cpp | 8 | ||||
-rw-r--r-- | src/core/web_contents_delegate_qt.h | 1 | ||||
-rw-r--r-- | src/core/web_engine_context.cpp | 9 | ||||
-rw-r--r-- | src/core/web_engine_context.h | 4 | ||||
-rw-r--r-- | src/core/web_engine_visited_links_manager.cpp | 105 | ||||
-rw-r--r-- | src/core/web_engine_visited_links_manager.h | 78 | ||||
-rwxr-xr-x | tools/scripts/take_snapshot.py | 2 |
11 files changed, 253 insertions, 3 deletions
diff --git a/src/core/core_gyp_generator.pro b/src/core/core_gyp_generator.pro index 5e6d08214..8d8298e99 100644 --- a/src/core/core_gyp_generator.pro +++ b/src/core/core_gyp_generator.pro @@ -76,6 +76,7 @@ SOURCES = \ web_engine_context.cpp \ web_engine_error.cpp \ web_engine_library_info.cpp \ + web_engine_visited_links_manager.cpp \ web_event_factory.cpp \ yuv_video_node.cpp @@ -122,5 +123,6 @@ HEADERS = \ web_engine_context.h \ web_engine_error.h \ web_engine_library_info.h \ + web_engine_visited_links_manager.h \ web_event_factory.h \ yuv_video_node.h diff --git a/src/core/qtwebengine.gypi b/src/core/qtwebengine.gypi index d1bee5fb6..f4482a858 100644 --- a/src/core/qtwebengine.gypi +++ b/src/core/qtwebengine.gypi @@ -6,6 +6,10 @@ 'version_script_location%': '<(chromium_src_dir)/chrome/tools/build/version.py', }, 'dependencies': [ + '<(chromium_src_dir)/base/base.gyp:base', + '<(chromium_src_dir)/base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations', + '<(chromium_src_dir)/components/components.gyp:visitedlink_browser', + '<(chromium_src_dir)/components/components.gyp:visitedlink_renderer', '<(chromium_src_dir)/content/content.gyp:content', '<(chromium_src_dir)/content/content.gyp:content_app_browser', '<(chromium_src_dir)/content/content.gyp:content_browser', @@ -15,19 +19,17 @@ '<(chromium_src_dir)/content/content.gyp:content_utility', '<(chromium_src_dir)/content/content.gyp:content_worker', '<(chromium_src_dir)/content/content_resources.gyp:content_resources', - '<(chromium_src_dir)/base/base.gyp:base', - '<(chromium_src_dir)/base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations', '<(chromium_src_dir)/ipc/ipc.gyp:ipc', '<(chromium_src_dir)/media/media.gyp:media', '<(chromium_src_dir)/net/net.gyp:net', '<(chromium_src_dir)/net/net.gyp:net_resources', '<(chromium_src_dir)/skia/skia.gyp:skia', + '<(chromium_src_dir)/third_party/WebKit/Source/web/web.gyp:webkit', '<(chromium_src_dir)/ui/gl/gl.gyp:gl', '<(chromium_src_dir)/ui/ui.gyp:ui', '<(chromium_src_dir)/url/url.gyp:url_lib', '<(chromium_src_dir)/v8/tools/gyp/v8.gyp:v8', '<(chromium_src_dir)/webkit/glue/webkit_glue.gyp:*', - '<(chromium_src_dir)/third_party/WebKit/Source/web/web.gyp:webkit', 'chrome_qt.gyp:chrome_qt', ], 'include_dirs': [ diff --git a/src/core/renderer/content_renderer_client_qt.cpp b/src/core/renderer/content_renderer_client_qt.cpp index ecb469a9d..af1ba7dcb 100644 --- a/src/core/renderer/content_renderer_client_qt.cpp +++ b/src/core/renderer/content_renderer_client_qt.cpp @@ -43,6 +43,7 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/common/localized_error.h" +#include "components/visitedlink/renderer/visitedlink_slave.h" #include "content/public/renderer/render_thread.h" #include "net/base/net_errors.h" #include "third_party/WebKit/public/platform/WebURLError.h" @@ -56,6 +57,20 @@ static const char kHttpErrorDomain[] = "http"; +ContentRendererClientQt::ContentRendererClientQt() +{ +} + +ContentRendererClientQt::~ContentRendererClientQt() +{ +} + +void ContentRendererClientQt::RenderThreadStarted() +{ + m_visitedLinkSlave.reset(new visitedlink::VisitedLinkSlave); + content::RenderThread::Get()->AddObserver(m_visitedLinkSlave.data()); +} + void ContentRendererClientQt::RenderViewCreated(content::RenderView* render_view) { // RenderViewObserver destroys itself with its RenderView. @@ -93,3 +108,13 @@ void ContentRendererClientQt::GetNavigationErrorStrings(blink::WebFrame *frame, *error_description = LocalizedError::GetErrorDetails(error, isPost); } } + +unsigned long long ContentRendererClientQt::VisitedLinkHash(const char *canonicalUrl, size_t length) +{ + return m_visitedLinkSlave->ComputeURLFingerprint(canonicalUrl, length); +} + +bool ContentRendererClientQt::IsLinkVisited(unsigned long long linkHash) +{ + return m_visitedLinkSlave->IsVisited(linkHash); +} diff --git a/src/core/renderer/content_renderer_client_qt.h b/src/core/renderer/content_renderer_client_qt.h index 360e82f2c..00705cdce 100644 --- a/src/core/renderer/content_renderer_client_qt.h +++ b/src/core/renderer/content_renderer_client_qt.h @@ -42,12 +42,26 @@ #include "content/public/renderer/content_renderer_client.h" #include <QtGlobal> +#include <QScopedPointer> + +namespace visitedlink { +class VisitedLinkSlave; +} class ContentRendererClientQt : public content::ContentRendererClient { public: + ContentRendererClientQt(); + ~ContentRendererClientQt(); + virtual void RenderThreadStarted() Q_DECL_OVERRIDE; virtual void RenderViewCreated(content::RenderView *render_view) Q_DECL_OVERRIDE; virtual bool ShouldSuppressErrorPage(const GURL &) Q_DECL_OVERRIDE { return false; } virtual void GetNavigationErrorStrings(blink::WebFrame* frame, const blink::WebURLRequest& failed_request, const blink::WebURLError& error , const std::string& accept_languages, std::string* error_html, base::string16* error_description) Q_DECL_OVERRIDE; + + virtual unsigned long long VisitedLinkHash(const char *canonicalUrl, size_t length) Q_DECL_OVERRIDE; + virtual bool IsLinkVisited(unsigned long long linkHash) Q_DECL_OVERRIDE; + +private: + QScopedPointer<visitedlink::VisitedLinkSlave> m_visitedLinkSlave; }; diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index b003a63a7..1de3ce160 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -50,6 +50,7 @@ #include "web_contents_adapter.h" #include "web_contents_adapter_client.h" #include "web_engine_context.h" +#include "web_engine_visited_links_manager.h" #include "content/public/browser/favicon_status.h" #include "content/public/browser/invalidate_type.h" @@ -58,6 +59,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/common/favicon_url.h" #include "content/public/common/file_chooser_params.h" +#include "content/public/common/frame_navigate_params.h" // Maps the LogSeverity defines in base/logging.h to the web engines message levels. @@ -251,3 +253,9 @@ void WebContentsDelegateQt::UpdateTargetURL(content::WebContents *source, int32 Q_UNUSED(page_id) m_viewClient->didUpdateTargetURL(toQt(url)); } +void WebContentsDelegateQt::DidNavigateAnyFrame(const content::LoadCommittedDetails &, const content::FrameNavigateParams ¶ms) +{ + if (!params.should_update_history) + return; + WebEngineContext::current()->visitedLinksManager()->addUrl(params.url); +} diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h index 33f06bf8d..44be77190 100644 --- a/src/core/web_contents_delegate_qt.h +++ b/src/core/web_contents_delegate_qt.h @@ -84,6 +84,7 @@ public: virtual void FindReply(content::WebContents *source, int request_id, int number_of_matches, const gfx::Rect& selection_rect, int active_match_ordinal, bool final_update) Q_DECL_OVERRIDE; virtual void RequestMediaAccessPermission(content::WebContents* web_contents, const content::MediaStreamRequest& request, const content::MediaResponseCallback& callback) Q_DECL_OVERRIDE; virtual void UpdateTargetURL(content::WebContents *source, int32 page_id, const GURL &url) Q_DECL_OVERRIDE; + virtual void DidNavigateAnyFrame(const content::LoadCommittedDetails&, const content::FrameNavigateParams& params) Q_DECL_OVERRIDE; private: WebContentsAdapterClient *m_viewClient; diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp index 82a6872a0..709000c10 100644 --- a/src/core/web_engine_context.cpp +++ b/src/core/web_engine_context.cpp @@ -77,6 +77,7 @@ #include "type_conversion.h" #include "surface_factory_qt.h" #include "web_engine_library_info.h" +#include "web_engine_visited_links_manager.h" #include <QGuiApplication> #include <QStringList> #include <QVector> @@ -109,6 +110,11 @@ scoped_refptr<WebEngineContext> WebEngineContext::current() return sContext; } +WebEngineVisitedLinksManager *WebEngineContext::visitedLinksManager() +{ + return m_visitedLinksManager.get(); +} + #ifndef CHROMIUM_VERSION #error Chromium version should be defined at gyp-time. Something must have gone wrong #define CHROMIUM_VERSION // This is solely to keep Qt Creator happy. @@ -204,4 +210,7 @@ WebEngineContext::WebEngineContext() // thread to avoid a thread check assertion in its constructor when it // first gets referenced on the IO thread. MediaCaptureDevicesDispatcher::GetInstance(); + + // Ensure we have a VisitedLinksMaster instance up and running + m_visitedLinksManager.reset(new WebEngineVisitedLinksManager); } diff --git a/src/core/web_engine_context.h b/src/core/web_engine_context.h index 13554066b..8a10700f7 100644 --- a/src/core/web_engine_context.h +++ b/src/core/web_engine_context.h @@ -56,11 +56,14 @@ class ContentMainRunner; class ContentMainDelegateQt; class SurfaceFactoryQt; +class WebEngineVisitedLinksManager; class WebEngineContext : public base::RefCounted<WebEngineContext> { public: static scoped_refptr<WebEngineContext> current(); + WebEngineVisitedLinksManager *visitedLinksManager(); + private: friend class base::RefCounted<WebEngineContext>; WebEngineContext(); @@ -73,6 +76,7 @@ private: #if defined(OS_ANDROID) scoped_ptr<SurfaceFactoryQt> m_surfaceFactory; #endif + scoped_ptr<WebEngineVisitedLinksManager> m_visitedLinksManager; }; #endif // WEB_ENGINE_CONTEXT_H diff --git a/src/core/web_engine_visited_links_manager.cpp b/src/core/web_engine_visited_links_manager.cpp new file mode 100644 index 000000000..c51ce7265 --- /dev/null +++ b/src/core/web_engine_visited_links_manager.cpp @@ -0,0 +1,105 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "web_engine_visited_links_manager.h" + +#include "content_browser_client_qt.h" +#include "browser_context_qt.h" +#include "type_conversion.h" + +#include "base/memory/scoped_ptr.h" +#include "components/visitedlink/browser/visitedlink_delegate.h" +#include "components/visitedlink/browser/visitedlink_master.h" + +namespace { +class BasicUrlIterator : public visitedlink::VisitedLinkMaster::URLIterator { +public: + BasicUrlIterator(const QList<QUrl> &urls) : m_urls(urls) {} + virtual const GURL& NextURL() { m_currentUrl = toGurl(m_urls.takeFirst()); return m_currentUrl; } + virtual bool HasNextURL() const { return !m_urls.isEmpty(); } +private: + QList<QUrl> m_urls; + GURL m_currentUrl; + +}; +} // Anonymous namespace + +// Due to the design of the visitedLink component, it seems safer to provide a +// basic delegate that will simply rebuild an empty visitedLink table if needed +// from the application history rather than crashing. This is functionality +// that was covered by QWebHistoryInterface in QtWebKitWidgets. + +class VisitedLinkDelegateQt : public visitedlink::VisitedLinkDelegate +{ +public: + ~VisitedLinkDelegateQt() {} + void RebuildTable(const scoped_refptr<URLEnumerator>& enumerator) { enumerator->OnComplete(true); } +}; + +void WebEngineVisitedLinksManager::deleteAllVisitedLinkData() +{ + m_visitedLinkMaster->DeleteAllURLs(); +} + +void WebEngineVisitedLinksManager::deleteVisitedLinkDataForUrls(const QList<QUrl> &urlsToDelete) +{ + BasicUrlIterator iterator(urlsToDelete); + m_visitedLinkMaster->DeleteURLs(&iterator); +} + +WebEngineVisitedLinksManager::WebEngineVisitedLinksManager() + : m_delegate(new VisitedLinkDelegateQt) +{ + Q_ASSERT(ContentBrowserClientQt::Get() && ContentBrowserClientQt::Get()->browser_context()); + BrowserContextQt *browserContext = ContentBrowserClientQt::Get()->browser_context(); + m_visitedLinkMaster.reset(new visitedlink::VisitedLinkMaster(browserContext, m_delegate.data(), /* persist to disk = */true)); + m_visitedLinkMaster->Init(); +} + +WebEngineVisitedLinksManager::~WebEngineVisitedLinksManager() +{ +} + +void WebEngineVisitedLinksManager::addUrl(const GURL &urlToAdd) +{ + Q_ASSERT(m_visitedLinkMaster); + m_visitedLinkMaster->AddURL(urlToAdd); +} diff --git a/src/core/web_engine_visited_links_manager.h b/src/core/web_engine_visited_links_manager.h new file mode 100644 index 000000000..0a976d95b --- /dev/null +++ b/src/core/web_engine_visited_links_manager.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef WEB_ENGINE_VISITED_LINKS_MANAGER_H +#define WEB_ENGINE_VISITED_LINKS_MANAGER_H + +#include "qtwebenginecoreglobal.h" +#include <QList> +#include <QScopedPointer> + +QT_BEGIN_NAMESPACE +class QUrl; +QT_END_NAMESPACE + +namespace visitedlink { +class VisitedLinkMaster; +} + +class VisitedLinkDelegateQt; + +class GURL; + +class QWEBENGINE_EXPORT WebEngineVisitedLinksManager { + +public: + virtual~WebEngineVisitedLinksManager(); + WebEngineVisitedLinksManager(); + + void deleteAllVisitedLinkData(); + void deleteVisitedLinkDataForUrls(const QList<QUrl> &); + +private: + void addUrl(const GURL &); + friend class WebContentsDelegateQt; + + QScopedPointer<visitedlink::VisitedLinkMaster> m_visitedLinkMaster; + QScopedPointer<VisitedLinkDelegateQt> m_delegate; +}; + +#endif // WEB_ENGINE_VISITED_LINKS_MANAGER_H diff --git a/tools/scripts/take_snapshot.py b/tools/scripts/take_snapshot.py index d6b8fedb1..7498a4d76 100755 --- a/tools/scripts/take_snapshot.py +++ b/tools/scripts/take_snapshot.py @@ -138,6 +138,8 @@ def isInChromiumBlacklist(file_path): or file_path.startswith('third_party/apple_sample_code') or file_path.startswith('third_party/bison') or file_path.startswith('third_party/brotli') + or (file_path.startswith('third_party/cacheinvalidation') and + not file_path.endswith('isolate')) or file_path.startswith('third_party/chromite') or file_path.startswith('third_party/cld_2') or file_path.startswith('third_party/codesighs') |