This change adds modification related to favicon.
References: https://review.tizen.org/gerrit/273261/
Change-Id: I0e72acea7c54565aef4eeb76194e73e8320b3d94
Signed-off-by: Ayush Kumar <ayush.k123@samsung.com>
"common/print_pages_params.cc",
"common/print_pages_params.h",
"common/render_messages_ewk.h",
+ "common/skia_bitmap_utils.cc",
+ "common/skia_bitmap_utils.h",
"common/version_info.cc",
"common/version_info.h",
"common/version_info_efl.h",
// found in the LICENSE file.
#include "browser/favicon/favicon_commands.h"
-#include "browser/favicon/favicon_database_p.h"
-#include "third_party/sqlite/sqlite3.h"
+
#include <iostream>
+#include <memory>
+
+#include "browser/favicon/favicon_database_p.h"
+#include "common/skia_bitmap_utils.h"
+#include "url/gurl.h"
#define CHECK_RESULT(qry, var, res, st, ret) if (var != res) {\
sqlite3_finalize(st);\
return ret;\
}
+namespace {
-std::string Command::lastError() const {
- return std::string("[") + m_name + "] :: " + m_lastError;
-}
+struct SerializedBitmap {
+ SerializedBitmap() : data(0), size(0) {}
+ ~SerializedBitmap() { free(); }
-std::string Command::name() const {
- return m_name;
-}
+ void alloc(size_t n) {
+ data = ::operator new(n);
+ size = n;
+ }
-void Command::setError(const std::string &err) {
- m_lastError = err;
-}
+ void free() {
+ if (data) {
+ ::operator delete(data);
+ data = nullptr;
+ size = 0;
+ }
+ }
-scoped_refptr<SerializedBitmap> Command::serialize(const SkBitmap &bitmap) {
- scoped_refptr<SerializedBitmap> res(new SerializedBitmap);
+ void* data;
+ size_t size;
+};
+
+std::unique_ptr<SerializedBitmap> serialize(const SkBitmap& bitmap) {
+ std::unique_ptr<SerializedBitmap> res(new SerializedBitmap);
if (bitmap.isNull()) {
return res;
}
static_cast<int *>(res->data)[1] = static_cast<int>(bitmap.alphaType());
static_cast<int *>(res->data)[2] = bitmap.width();
static_cast<int *>(res->data)[3] = bitmap.height();
-#if !defined(EWK_BRINGUP) // FIXME: m67 bringup
- if (!bitmap.copyPixelsTo(static_cast<int *>(res->data) + 4, bitmap.getSize())) {
+ if (!skia_bitmap_utils::CopyPixels(static_cast<int*>(res->data) + 4,
+ bitmap.getPixels(), bitmap.info())) {
res->free();
}
-#endif
return res;
}
-SkBitmap Command::deserialize(const void *data) {
+SkBitmap deserialize(const void* data) {
if (!data) {
return SkBitmap();
}
// the deserialized SkBitmap owns and holds it's internal image data
// for it's whole lifetime, we create a deep copy of the |bitmap|.
SkBitmap copy;
-#if !defined(EWK_BRINGUP) // FIXME: m67 bringup
- bitmap.copyTo(©, colorType);
-#endif
+ if (copy.tryAllocPixels(bitmap.info()))
+ bitmap.readPixels(copy.info(), copy.getPixels(), copy.rowBytes(), 0, 0);
return copy;
}
+} // namespace
+
+std::string Command::lastError() const {
+ return std::string("[") + m_name + "] :: " + m_lastError;
+}
+
+std::string Command::name() const {
+ return m_name;
+}
+
+void Command::setError(const std::string& err) {
+ m_lastError = err;
+}
+
const char *Command::sqlite3ErrStr(int rc) {
static const char* const aMsg[] = {
/* SQLITE_OK */ "not an error",
result = sqlite3_bind_text(stmt, 1, m_faviconUrl.c_str(), m_faviconUrl.size(), SQLITE_STATIC);
CHECK_RESULT_MSG(query, result, SQLITE_OK, stmt, false);
- scoped_refptr<SerializedBitmap> serializedBitmap = serialize(m_bitmap);
+ std::unique_ptr<SerializedBitmap> serializedBitmap = serialize(m_bitmap);
if (!serializedBitmap->data) {
sqlite3_finalize(stmt);
sqlite3_free(query);
int result = sqlite3_prepare_v2(db()->sqlite, query, -1, &stmt, 0);
CHECK_PREP_MSG(query, result, SQLITE_OK, false);
- scoped_refptr<SerializedBitmap> serializedBitmap = serialize(m_bitmap);
+ std::unique_ptr<SerializedBitmap> serializedBitmap = serialize(m_bitmap);
if (!serializedBitmap->data) {
sqlite3_finalize(stmt);
return false;
#ifndef FAVICON_COMMANDS_H
#define FAVICON_COMMANDS_H
-#include "url/gurl.h"
-#include "base/memory/ref_counted.h"
+#include <string>
#include "third_party/skia/include/core/SkBitmap.h"
+class GURL;
class FaviconDatabasePrivate;
-struct SerializedBitmap : public base::RefCounted<SerializedBitmap> {
- SerializedBitmap() : data(0), size(0) {}
- ~SerializedBitmap() {
- free();
- }
-
- void alloc(size_t n) {
- free();
- data = ::operator new(n);
- size = n;
- }
-
- void free() {
- if (data) {
- ::operator delete(data);
- data = 0;
- size = 0;
- }
- }
-
- void *data;
- size_t size;
-};
-
class Command {
public:
Command(const std::string &cmdName, FaviconDatabasePrivate *db)
std::string name() const;
protected:
- static scoped_refptr<SerializedBitmap> serialize(const SkBitmap &bitmap);
- static SkBitmap deserialize(const void *data);
static const char *sqlite3ErrStr(int rc);
FaviconDatabasePrivate *db() const {
#include "base/logging.h"
#include "base/task/bind_post_task.h"
#include "base/task/thread_pool.h"
-#include "content/public/browser/browser_task_traits.h"
#include "favicon_commands.h"
#include "favicon_database_p.h"
}
g_sqlite3_initialized = true;
}
+
+ if (d->path.empty())
+ return false;
+
+ base::FilePath dir = d->path.DirName();
+ if (!base::DirectoryExists(dir) && !base::CreateDirectory(dir))
+ return false;
+
result_code = sqlite3_open(d->path.value().c_str(), &d->sqlite);
if (result_code != SQLITE_OK) {
LOG(ERROR) << "[FaviconDatabase] :: Error opening SQLite database ("
}
void FaviconDatabase::SyncSQLite() {
-#if !defined(EWK_BRINGUP) // FIXME: m67 bringup
- scoped_refptr<base::SingleThreadTaskRunner> ptr =
- content::BrowserThread::GetTaskRunnerForThread(
- content::BrowserThread::DB);
-#else
- scoped_refptr<base::SingleThreadTaskRunner> ptr =
- base::ThreadPool::CreateSingleThreadTaskRunner(
- {content::BrowserThread::UI});
-#endif
- ptr->PostTask(FROM_HERE, base::BindOnce(&FaviconDatabasePrivate::performSync,
- d->weakPtrFactory.GetWeakPtr()));
+ d->task_runner()->PostTask(
+ FROM_HERE, base::BindOnce(&FaviconDatabasePrivate::performSync,
+ d->weakPtrFactory.GetWeakPtr()));
}
void FaviconDatabase::ScheduleSync() {
// found in the LICENSE file.
#include "favicon_database_p.h"
+
#include <iostream>
+
+#include "base/logging.h"
+#include "base/path_service.h"
#include "base/task/bind_post_task.h"
#include "base/task/thread_pool.h"
-#include "content/public/browser/browser_task_traits.h"
+#include "content/common/paths_efl.h"
#include "favicon_commands.h"
const char * const FaviconDatabasePrivate::pageUrlToFaviconUrlTable = "url_to_favicon_url";
const char * const FaviconDatabasePrivate::defaultFilename = "WebpageIcons.db";
FaviconDatabasePrivate::FaviconDatabasePrivate()
- : path(ewk_home_directory_get()),
+ : task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
+ {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
+ base::TaskShutdownBehavior::BLOCK_SHUTDOWN})),
privateBrowsing(false),
sqlite(0),
weakPtrFactory(this) {
- path.Append(defaultDirSuffix).Append(defaultFilename);
+ base::FilePath db_path;
+ if (base::PathService::Get(PathsEfl::WEB_DATABASE_DIR, &db_path))
+ path = db_path.Append(FILE_PATH_LITERAL(defaultFilename));
+ else
+ LOG(ERROR) << "[favicon] Could not get web database directory";
}
GURL FaviconDatabasePrivate::faviconUrlForPageUrl(const GURL &pageUrl) const {
return it != faviconUrlToBitmap.end();
}
-scoped_refptr<base::SingleThreadTaskRunner> FaviconDatabasePrivate::taskRunner() const {
-#if !defined(EWK_BRINGUP) // FIXME: m67 bringup
- return content::BrowserThread::GetTaskRunnerForThread(
- content::BrowserThread::DB);
-#else
- return base::ThreadPool::CreateSingleThreadTaskRunner(
- {content::BrowserThread::UI});
-#endif
-}
-
void FaviconDatabasePrivate::performSync() {
- std::cerr << "[FaviconDatabasePrivate::performSync()]" << std::endl;
base::AutoLock locker(mutex);
timer.Stop();
while (!commands.empty()) {
Command *cmd = commands.front();
if (!cmd->sqlExecute()) {
- std::cerr << "[FaviconDatabasePrivate::performSync] :: " << "Error while executing command:\n\t" << cmd->lastError() << std::endl;
+ LOG(ERROR) << "[FaviconDatabasePrivate::performSync] :: "
+ << "Error while executing command: " << cmd->lastError();
// abort or what?
}
commands.pop();
#include "base/files/file_path.h"
#include "base/memory/weak_ptr.h"
#include "base/synchronization/lock.h"
-#include "base/task/single_thread_task_runner.h"
+#include "base/task/sequenced_task_runner.h"
#include "base/timer/timer.h"
#include "content/public/browser/browser_thread.h"
#include "favicon_database.h"
bool existsForFaviconURL(const GURL &faviconUrl) const;
- scoped_refptr<base::SingleThreadTaskRunner> taskRunner() const;
+ scoped_refptr<base::SequencedTaskRunner> task_runner() const {
+ return task_runner_;
+ }
+
void performSync();
std::map<GURL, GURL> pageToFaviconUrl;
std::map<GURL, SkBitmap> faviconUrlToBitmap;
base::FilePath path;
+ scoped_refptr<base::SequencedTaskRunner> task_runner_;
bool privateBrowsing;
sqlite3 *sqlite;
--- /dev/null
+// Copyright 2018 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "skia_bitmap_utils.h"
+
+namespace skia_bitmap_utils {
+
+bool CopyPixels(void* dst_addr, const void* src_addr, const SkImageInfo& info) {
+ if (!dst_addr || !src_addr)
+ return false;
+
+ size_t row_bytes = info.bytesPerPixel() * info.width();
+ for (int y = 0; y < info.height(); ++y) {
+ memcpy(dst_addr, src_addr, row_bytes);
+ src_addr = static_cast<const char*>(src_addr) + row_bytes;
+ dst_addr = static_cast<char*>(dst_addr) + row_bytes;
+ }
+
+ return true;
+}
+
+} // namespace skia_bitmap_utils
--- /dev/null
+// Copyright 2018 Samsung Electronics. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef TIZEN_SRC_EWK_EFL_INTEGRATION_COMMON_SKIA_BITMAP_UTILS_H
+#define TIZEN_SRC_EWK_EFL_INTEGRATION_COMMON_SKIA_BITMAP_UTILS_H
+
+#include "third_party/skia/include/core/SkBitmap.h"
+
+namespace skia_bitmap_utils {
+
+bool CopyPixels(void* dst_addr, const void* src_addr, const SkImageInfo& info);
+
+} // namespace skia_bitmap_utils
+
+#endif // TIZEN_SRC_EWK_EFL_INTEGRATION_COMMON_SKIA_BITMAP_UTILS_H
evas_object_image_fill_set(favicon, 0, 0, bitmap.width(), bitmap.height());
evas_object_image_filled_set(favicon, EINA_TRUE);
evas_object_image_alpha_set(favicon, EINA_TRUE);
-
-#if !defined(EWK_BRINGUP) // FIXME: m67 bringup
- void* pixels = evas_object_image_data_get(favicon, EINA_TRUE);
- if (pixels) {
- bitmap.copyPixelsTo(pixels, bitmap.getSize());
- evas_object_image_data_set(favicon, pixels);
- }
-#endif
+ evas_object_image_data_copy_set(favicon, bitmap.getPixels());
return favicon;
}
evas_object_image_size_set(icon, icon_.width(), icon_.height());
evas_object_image_colorspace_set(icon, EVAS_COLORSPACE_ARGB8888);
evas_object_image_alpha_set(icon, EINA_TRUE);
- void* pixels = evas_object_image_data_get(icon, EINA_TRUE);
-
-#if !defined(EWK_BRINGUP) // FIXME: m67 bringup
- if (pixels) {
- icon_.copyPixelsTo(pixels, icon_.getSize());
- evas_object_image_data_set(icon, pixels);
- }
-#endif
+ evas_object_image_data_copy_set(icon, icon_.getPixels());
return icon;
}
EINA_SAFETY_ON_NULL_RETURN_VAL(ewkContext, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(directoryPath, EINA_FALSE);
base::FilePath path(directoryPath);
- path.Append(FaviconDatabasePrivate::defaultFilename);
- return ewkContext->SetFaviconDatabasePath(path) ? EINA_TRUE : EINA_FALSE;
+ path = path.Append(FaviconDatabasePrivate::defaultFilename);
+ return ewkContext->SetFaviconDatabasePath(path);
}
void ewk_context_preferred_languages_set(Eina_List* languages)
return;
web_view_->SmartCallback<EWebViewCallbacks::LoadFinished>().call();
- NavigationEntry* entry = web_contents().GetController().GetVisibleEntry();
- if (!entry)
- return;
-
- FaviconStatus& favicon = entry->GetFavicon();
-
- if (favicon.valid) {
- // check/update the url and favicon url in favicon database
- FaviconDatabase::Instance()->SetFaviconURLForPageURL(favicon.url,
- validated_url);
-
- // download favicon if there is no such in database
- if (!FaviconDatabase::Instance()->ExistsForFaviconURL(favicon.url)) {
- LOG(ERROR) << "[DidFinishLoad] :: no favicon in database for URL: "
- << favicon.url.spec();
- favicon_downloader_.reset(new FaviconDownloader(
- &web_contents_, favicon.url,
- base::BindOnce(&WebContentsDelegateEfl::DidDownloadFavicon,
- weak_ptr_factory_.GetWeakPtr())));
- favicon_downloader_->Start();
- } else {
- web_view_->SmartCallback<EWebViewCallbacks::IconReceived>().call();
- }
- }
-
web_contents_.Focus();
}
const std::vector<blink::mojom::FaviconURLPtr>& candidates) {
// select and set proper favicon
for (const auto& favicon : candidates) {
- if (favicon->icon_type == blink::mojom::FaviconIconType::kFavicon &&
- !favicon->icon_url.is_valid()) {
+ if (!favicon->icon_url.is_valid())
+ continue;
+
+ if (favicon->icon_type == blink::mojom::FaviconIconType::kFavicon) {
NavigationEntry* entry = web_contents_.GetController().GetVisibleEntry();
if (!entry)
return;
entry->GetFavicon().url = favicon->icon_url;
entry->GetFavicon().valid = true;
+
+ // check/update the url and favicon url in favicon database
+ FaviconDatabase::Instance()->SetFaviconURLForPageURL(favicon->icon_url,
+ entry->GetURL());
+
+ // download favicon if there is no such in database
+ if (!FaviconDatabase::Instance()->ExistsForFaviconURL(
+ favicon->icon_url)) {
+ LOG(INFO) << "No favicon in database for URL: "
+ << favicon->icon_url.spec();
+ favicon_downloader_.reset(new FaviconDownloader(
+ &web_contents_, favicon->icon_url,
+ base::BindOnce(&WebContentsDelegateEfl::DidDownloadFavicon,
+ weak_ptr_factory_.GetWeakPtr())));
+ favicon_downloader_->Start();
+ } else {
+ web_view_->SmartCallback<EWebViewCallbacks::IconReceived>().call();
+ }
return;
}
}