2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * WebKitEngineService.cpp
20 * Created on: Apr 1, 2014
24 #include "browser_config.h"
25 #include "WebKitEngineService.h"
26 #include "AbstractWebEngine/TabThumbCache.h"
30 #include <BrowserImage.h>
33 #include "BrowserAssert.h"
34 #include "BrowserLogger.h"
37 namespace tizen_browser {
38 namespace basic_webengine {
39 namespace webkitengine_service {
41 EXPORT_SERVICE(WebKitEngineService, "org.tizen.browser.webkitengineservice")
43 WebKitEngineService::WebKitEngineService()
44 : m_initialised(false)
45 , m_privateMode(false)
46 , m_guiParent(nullptr)
47 , m_currentTabId(TabId::NONE)
49 m_mostRecentTab.clear();
54 WebKitEngineService::~WebKitEngineService()
58 Evas_Object * WebKitEngineService::getLayout()
60 M_ASSERT(m_currentWebView);
61 return m_currentWebView->getLayout();
64 void WebKitEngineService::init(void * guiParent)
66 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
68 m_guiParent = guiParent;
73 void WebKitEngineService::connectSignals(std::shared_ptr<WebView> webView)
76 webView->favIconChanged.connect(boost::bind(&WebKitEngineService::_favIconChanged, this, _1));
77 webView->titleChanged.connect(boost::bind(&WebKitEngineService::_titleChanged, this, _1));
78 webView->uriChanged.connect(boost::bind(&WebKitEngineService::_uriChanged, this, _1));
79 webView->loadFinished.connect(boost::bind(&WebKitEngineService::_loadFinished, this));
80 webView->loadStarted.connect(boost::bind(&WebKitEngineService::_loadStarted, this));
81 webView->loadStop.connect(boost::bind(&WebKitEngineService::_loadStop, this));
82 webView->loadProgress.connect(boost::bind(&WebKitEngineService::_loadProgress, this, _1));
83 webView->loadError.connect(boost::bind(&WebKitEngineService::_loadError, this));
84 webView->forwardEnableChanged.connect(boost::bind(&WebKitEngineService::_forwardEnableChanged, this, _1));
85 webView->backwardEnableChanged.connect(boost::bind(&WebKitEngineService::_backwardEnableChanged, this, _1));
86 webView->cofirmationRequest.connect(boost::bind(&WebKitEngineService::_confirmationRequest, this, _1));
87 webView->ewkViewClicked.connect(boost::bind(&WebKitEngineService::webViewClicked, this));
88 webView->IMEStateChanged.connect(boost::bind(&WebKitEngineService::_IMEStateChanged, this, _1));
91 void WebKitEngineService::disconnectSignals(std::shared_ptr<WebView> webView)
94 webView->favIconChanged.disconnect(boost::bind(&WebKitEngineService::_favIconChanged, this));
95 webView->titleChanged.disconnect(boost::bind(&WebKitEngineService::_titleChanged, this, _1));
96 webView->uriChanged.disconnect(boost::bind(&WebKitEngineService::_uriChanged, this, _1));
97 webView->loadFinished.disconnect(boost::bind(&WebKitEngineService::_loadFinished, this));
98 webView->loadStarted.disconnect(boost::bind(&WebKitEngineService::_loadStarted, this));
99 webView->loadStop.disconnect(boost::bind(&WebKitEngineService::_loadStop, this));
100 webView->loadProgress.disconnect(boost::bind(&WebKitEngineService::_loadProgress, this, _1));
101 webView->loadError.disconnect(boost::bind(&WebKitEngineService::_loadError, this));
102 webView->forwardEnableChanged.disconnect(boost::bind(&WebKitEngineService::_forwardEnableChanged, this, _1));
103 webView->backwardEnableChanged.disconnect(boost::bind(&WebKitEngineService::_backwardEnableChanged, this, _1));
104 webView->cofirmationRequest.disconnect(boost::bind(&WebKitEngineService::_confirmationRequest, this, _1));
105 webView->ewkViewClicked.disconnect(boost::bind(&WebKitEngineService::webViewClicked, this));
106 webView->IMEStateChanged.disconnect(boost::bind(&WebKitEngineService::_IMEStateChanged, this, _1));
109 void WebKitEngineService::disconnectCurrentWebViewSignals()
111 if(m_currentWebView.get())
112 disconnectSignals(m_currentWebView);
115 void WebKitEngineService::setURI(const std::string & uri)
117 BROWSER_LOGD("%s:%d %s uri=%s", __FILE__, __LINE__, __func__, uri.c_str());
118 M_ASSERT(m_currentWebView);
119 m_currentWebView->setURI(uri);
122 std::string WebKitEngineService::getURI() const
124 M_ASSERT(m_currentWebView);
126 return m_currentWebView->getURI();
128 return std::string("");
131 bool WebKitEngineService::isLoadError() const
133 return m_currentWebView->isLoadError();
137 std::string WebKitEngineService::getTitle() const
139 M_ASSERT(m_currentWebView);
141 return m_currentWebView->getTitle();
143 return std::string("");
146 void WebKitEngineService::stopLoading(void)
148 M_ASSERT(m_currentWebView);
149 m_currentWebView->stopLoading();
152 void WebKitEngineService::reload(void)
154 M_ASSERT(m_currentWebView);
155 m_currentWebView->reload();
158 void WebKitEngineService::back(void)
160 M_ASSERT(m_currentWebView);
161 m_currentWebView->back();
164 void WebKitEngineService::forward(void)
166 M_ASSERT(m_currentWebView);
167 m_currentWebView->forward();
170 bool WebKitEngineService::isBackEnabled() const
172 M_ASSERT(m_currentWebView);
173 return m_currentWebView->isBackEnabled();
176 bool WebKitEngineService::isForwardEnabled() const
178 M_ASSERT(m_currentWebView);
179 return m_currentWebView->isForwardEnabled();
182 bool WebKitEngineService::isLoading() const
184 M_ASSERT(m_currentWebView);
185 return m_currentWebView->isBackEnabled();
188 void WebKitEngineService::_favIconChanged(std::shared_ptr<tizen_browser::tools::BrowserImage> bi)
190 BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
194 void WebKitEngineService::_titleChanged(const std::string & title)
199 void WebKitEngineService::_uriChanged(const std::string & uri)
204 void WebKitEngineService::_uriChangedOnTab(TabId id)
206 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
210 void WebKitEngineService::_loadFinished()
215 void WebKitEngineService::_loadStarted()
220 void WebKitEngineService::_loadStop()
225 void WebKitEngineService::_loadError()
231 void WebKitEngineService::_forwardEnableChanged(bool enable)
233 forwardEnableChanged(enable);
236 void WebKitEngineService::_backwardEnableChanged(bool enable)
238 backwardEnableChanged(enable);
241 void WebKitEngineService::_loadProgress(double d)
246 void WebKitEngineService::_confirmationRequest(WebConfirmationPtr c)
248 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
249 confirmationRequest(c);
252 int WebKitEngineService::tabsCount() const
254 return m_tabs.size();
257 TabId WebKitEngineService::currentTabId() const
259 return m_currentTabId;
262 std::list<TabId> WebKitEngineService::listTabs() const
264 return m_mostRecentTab;
267 std::vector<std::shared_ptr<TabContent> > WebKitEngineService::getTabContents() const {
268 std::vector<std::shared_ptr<TabContent>> result;
269 for(std::list<TabId>::const_iterator it = m_chronoTabs.begin(); it != m_chronoTabs.end(); it++){
270 WebViewPtr item = m_tabs.find(*it)->second;
272 tizen_browser::services::TabThumbCache* thumbCache = tizen_browser::services::TabThumbCache::getInstance();
273 std::shared_ptr<tizen_browser::tools::BrowserImage> thumbnail = thumbCache->getThumb(*it);
275 auto tabContent = std::make_shared<TabContent>(*it, item->getTitle(), thumbnail);
276 result.push_back(tabContent);
281 TabId WebKitEngineService::addTab(const std::string & uri, const TabId * openerId, bool desktopMode)
283 BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
285 // searching for next available tabId
287 WebViewPtr p = std::make_shared<WebView>(reinterpret_cast<Evas_Object *>(m_guiParent), newTabId);
289 p->init(desktopMode, getTabView(*openerId));
291 p->init(desktopMode);
293 m_tabs[newTabId] = p;
299 p->tabIdChecker.connect(boost::bind(&WebKitEngineService::_uriChangedOnTab,this,_1));
301 // if it is first tab
302 if (m_tabs.size() == 1) {
303 switchToTab(newTabId);
306 AbstractWebEngine::tabCreated();
308 m_chronoTabs.push_front(newTabId);
313 Evas_Object* WebKitEngineService::getTabView(TabId id){
314 return m_tabs[id]->getLayout();
317 bool WebKitEngineService::switchToTab(tizen_browser::basic_webengine::TabId newTabId)
319 BROWSER_LOGD("[%s:%d] newTabId=%s", __PRETTY_FUNCTION__, __LINE__, newTabId.toString().c_str());
321 // if there was any running WebView
322 if (m_currentWebView) {
323 disconnectSignals(m_currentWebView);
326 m_currentWebView = m_tabs[newTabId];
327 m_currentTabId = newTabId;
328 m_mostRecentTab.remove(newTabId);
329 m_mostRecentTab.push_back(newTabId);
331 connectSignals(m_currentWebView);
333 titleChanged(m_currentWebView->getTitle());
334 uriChanged(m_currentWebView->getURI());
335 forwardEnableChanged(m_currentWebView->isForwardEnabled());
336 backwardEnableChanged(m_currentWebView->isBackEnabled());
337 favIconChanged(m_currentWebView->getFavicon());
338 currentTabChanged(m_currentTabId);
343 bool WebKitEngineService::closeTab()
345 BROWSER_LOGD("%s:%d %s closing tab=%s", __FILE__, __LINE__, __func__, m_currentTabId.toString().c_str());
346 bool res = closeTab(m_currentTabId);
350 bool WebKitEngineService::closeTab(TabId id) {
351 BROWSER_LOGD("%s:%d %s closing tab=%s", __FILE__, __LINE__, __func__, id.toString().c_str());
352 BROWSER_LOGD("%s:%d %s NONE tab=%s", __FILE__, __LINE__, __func__, TabId::NONE.toString().c_str());
354 TabId closingTabId = id;
356 if(closingTabId == TabId::NONE){
359 m_tabs.erase(closingTabId);
360 m_chronoTabs.remove(closingTabId);
361 m_mostRecentTab.remove(closingTabId);
362 if (m_tabs.size() == 0) {
363 m_currentTabId = TabId::NONE;
365 else if (closingTabId == m_currentTabId && m_mostRecentTab.size()){
366 res = switchToTab(m_mostRecentTab.back());
369 tabClosed(closingTabId);
374 bool WebKitEngineService::nextTab()
376 // Empty implementation, with random UUID as ID we cannot distinguish between previous and next tab. Functionality not used.
380 bool WebKitEngineService::prevTab()
382 // Empty implementation, with random UUID as ID we cannot distinguish between previous and next tab. Functionality not used.
386 void WebKitEngineService::confirmationResult(WebConfirmationPtr c)
388 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
390 M_ASSERT(c && c->getTabId() != TabId());
392 // check if still exists
393 if (m_tabs.find(c->getTabId()) == m_tabs.end()) {
397 m_tabs[c->getTabId()]->confirmationResult(c);
400 void WebKitEngineService::setPrivateMode(bool state)
402 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
404 if (m_privateMode == state) {
405 BROWSER_LOGD("%s:%d %s new privateMode is the same", __FILE__, __LINE__, __func__);
409 m_privateMode = state;
411 for(std::map<TabId, WebViewPtr>::iterator it = m_tabs.begin(), end = m_tabs.end(); it != end; ++it)
412 it->second->setPrivateMode(state);
415 bool WebKitEngineService::isPrivateMode() const
417 return m_privateMode;
420 std::shared_ptr<tizen_browser::tools::BrowserImage> WebKitEngineService::getSnapshotData(int width, int height)
422 M_ASSERT(m_currentWebView);
424 return m_currentWebView->captureSnapshot(width, height);
426 return std::make_shared<tizen_browser::tools::BrowserImage>();
430 std::shared_ptr<tizen_browser::tools::BrowserImage> WebKitEngineService::getSnapshotData(TabId id, int width, int height){
431 return m_tabs[id]->captureSnapshot(width,height);
434 void WebKitEngineService::setFocus()
436 M_ASSERT(m_currentWebView);
437 m_currentWebView->setFocus();
440 void WebKitEngineService::clearFocus()
442 M_ASSERT(m_currentWebView);
443 m_currentWebView->clearFocus();
446 bool WebKitEngineService::hasFocus() const
448 M_ASSERT(m_currentWebView);
449 return m_currentWebView->hasFocus();
453 std::shared_ptr<tizen_browser::tools::BrowserImage> WebKitEngineService::getFavicon()
455 M_ASSERT(m_currentWebView);
457 return m_currentWebView->getFavicon();
459 return std::make_shared<tizen_browser::tools::BrowserImage>();
462 void WebKitEngineService::webViewClicked()
464 AbstractWebEngine::webViewClicked();
468 int WebKitEngineService::getZoomFactor() const
470 if(!m_currentWebView)
472 return static_cast<int>(m_currentWebView->getZoomFactor()*100);
476 void WebKitEngineService::setZoomFactor(int zoomFactor)
478 M_ASSERT(m_currentWebView);
479 m_currentWebView->setZoomFactor(0.01*zoomFactor);
483 void WebKitEngineService::clearPrivateData()
485 for(std::map<TabId, WebViewPtr>::const_iterator it = m_tabs.begin(); it != m_tabs.end(); it++){
486 it->second->clearPrivateData();
490 void WebKitEngineService::searchOnWebsite(const std::string & searchString, int flags)
492 m_currentWebView->searchOnWebsite(searchString, flags);
495 void WebKitEngineService::_IMEStateChanged(bool enable)
497 IMEStateChanged(enable);
500 void WebKitEngineService::backButtonClicked() const
502 M_ASSERT(m_currentWebView);
503 if (isBackEnabled()) {
504 m_currentWebView->back();
510 void WebKitEngineService::switchToDesktopMode()
512 M_ASSERT(m_currentWebView);
513 m_currentWebView->switchToDesktopMode();
516 void WebKitEngineService::switchToMobileMode()
518 M_ASSERT(m_currentWebView);
519 m_currentWebView->switchToMobileMode();
522 bool WebKitEngineService::isDesktopMode() const
524 M_ASSERT(m_currentWebView);
525 return m_currentWebView->isDesktopMode();
528 } /* end of webkitengine_service */
529 } /* end of basic_webengine */
530 } /* end of tizen_browser */