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_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);
120 m_currentWebView->setURI(uri);
123 std::string WebKitEngineService::getURI() const
125 M_ASSERT(m_currentWebView);
127 return m_currentWebView->getURI();
129 return std::string("");
132 bool WebKitEngineService::isLoadError() const
134 return m_currentWebView->isLoadError();
138 std::string WebKitEngineService::getTitle() const
140 M_ASSERT(m_currentWebView);
141 if (m_currentWebView) {
143 return m_currentWebView->getURI();
145 return m_currentWebView->getTitle();
147 return std::string("");
150 void WebKitEngineService::suspend()
153 M_ASSERT(m_currentWebView);
154 m_currentWebView->suspend();
158 void WebKitEngineService::resume()
161 M_ASSERT(m_currentWebView);
162 m_currentWebView->resume();
166 bool WebKitEngineService::isSuspended() const
168 M_ASSERT(m_currentWebView);
169 return m_currentWebView->isSuspended();
172 void WebKitEngineService::stopLoading(void)
174 M_ASSERT(m_currentWebView);
176 m_currentWebView->stopLoading();
179 void WebKitEngineService::reload(void)
181 M_ASSERT(m_currentWebView);
183 m_currentWebView->reload();
186 void WebKitEngineService::back(void)
188 M_ASSERT(m_currentWebView);
190 m_currentWebView->back();
193 void WebKitEngineService::forward(void)
195 M_ASSERT(m_currentWebView);
197 m_currentWebView->forward();
200 bool WebKitEngineService::isBackEnabled() const
202 M_ASSERT(m_currentWebView);
203 return m_currentWebView->isBackEnabled();
206 bool WebKitEngineService::isForwardEnabled() const
208 M_ASSERT(m_currentWebView);
209 return m_currentWebView->isForwardEnabled();
212 bool WebKitEngineService::isLoading() const
214 M_ASSERT(m_currentWebView);
215 return m_currentWebView->isBackEnabled();
218 void WebKitEngineService::_favIconChanged(std::shared_ptr<tizen_browser::tools::BrowserImage> bi)
220 BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
224 void WebKitEngineService::_titleChanged(const std::string & title)
229 void WebKitEngineService::_uriChanged(const std::string & uri)
234 void WebKitEngineService::_loadFinished()
239 void WebKitEngineService::_loadStarted()
244 void WebKitEngineService::_loadStop()
249 void WebKitEngineService::_loadError()
255 void WebKitEngineService::_forwardEnableChanged(bool enable)
257 forwardEnableChanged(enable);
260 void WebKitEngineService::_backwardEnableChanged(bool enable)
262 backwardEnableChanged(enable);
265 void WebKitEngineService::_loadProgress(double d)
270 void WebKitEngineService::_confirmationRequest(WebConfirmationPtr c)
272 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
273 confirmationRequest(c);
276 int WebKitEngineService::tabsCount() const
278 return m_tabs.size();
281 TabId WebKitEngineService::currentTabId() const
283 return m_currentTabId;
286 std::list<TabId> WebKitEngineService::listTabs() const
288 return m_mostRecentTab;
291 std::vector<std::shared_ptr<TabContent> > WebKitEngineService::getTabContents() const {
292 std::vector<std::shared_ptr<TabContent>> result;
293 for(std::list<TabId>::const_iterator it = m_chronoTabs.begin(); it != m_chronoTabs.end(); it++){
294 WebViewPtr item = m_tabs.find(*it)->second;
296 tizen_browser::services::TabThumbCache* thumbCache = tizen_browser::services::TabThumbCache::getInstance();
297 std::shared_ptr<tizen_browser::tools::BrowserImage> thumbnail = thumbCache->getThumb(*it);
299 auto tabContent = std::make_shared<TabContent>(*it, item->getTitle(), thumbnail);
300 result.push_back(tabContent);
305 TabId WebKitEngineService::addTab(const std::string & uri, const TabId * openerId, bool desktopMode, bool incognitoMode)
307 AbstractWebEngine::checkIfCreate();
309 config::DefaultConfig config;
312 if (tabsCount() >= boost::any_cast<int>(config.get("TAB_LIMIT")))
313 return currentTabId();
315 BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
317 // searching for next available tabId
319 WebViewPtr p = std::make_shared<WebView>(reinterpret_cast<Evas_Object *>(m_guiParent), newTabId, incognitoMode);
321 p->init(desktopMode, getTabView(*openerId));
323 p->init(desktopMode);
325 m_tabs[newTabId] = p;
331 switchToTab(newTabId);
332 AbstractWebEngine::tabCreated();
333 m_chronoTabs.push_front(newTabId);
338 Evas_Object* WebKitEngineService::getTabView(TabId id){
339 return m_tabs[id]->getLayout();
342 bool WebKitEngineService::switchToTab(tizen_browser::basic_webengine::TabId newTabId)
344 BROWSER_LOGD("[%s:%d] newTabId=%s", __PRETTY_FUNCTION__, __LINE__, newTabId.toString().c_str());
346 // if there was any running WebView
347 if (m_currentWebView) {
348 disconnectSignals(m_currentWebView);
352 m_currentWebView = m_tabs[newTabId];
353 m_currentTabId = newTabId;
354 m_mostRecentTab.remove(newTabId);
355 m_mostRecentTab.push_back(newTabId);
357 connectSignals(m_currentWebView);
360 titleChanged(m_currentWebView->getTitle());
361 uriChanged(m_currentWebView->getURI());
362 forwardEnableChanged(m_currentWebView->isForwardEnabled());
363 backwardEnableChanged(m_currentWebView->isBackEnabled());
364 favIconChanged(m_currentWebView->getFavicon());
365 currentTabChanged(m_currentTabId);
370 bool WebKitEngineService::closeTab()
372 BROWSER_LOGD("%s:%d %s closing tab=%s", __FILE__, __LINE__, __func__, m_currentTabId.toString().c_str());
373 bool res = closeTab(m_currentTabId);
377 bool WebKitEngineService::closeTab(TabId id) {
378 BROWSER_LOGD("%s:%d %s closing tab=%s", __FILE__, __LINE__, __func__, id.toString().c_str());
379 BROWSER_LOGD("%s:%d %s NONE tab=%s", __FILE__, __LINE__, __func__, TabId::NONE.toString().c_str());
381 TabId closingTabId = id;
383 if(closingTabId == TabId::NONE){
386 m_tabs.erase(closingTabId);
387 m_chronoTabs.remove(closingTabId);
388 m_mostRecentTab.remove(closingTabId);
389 if (m_tabs.size() == 0) {
390 m_currentTabId = TabId::NONE;
392 else if (closingTabId == m_currentTabId && m_mostRecentTab.size()){
393 res = switchToTab(m_mostRecentTab.back());
396 tabClosed(closingTabId);
401 bool WebKitEngineService::nextTab()
403 // Empty implementation, with random UUID as ID we cannot distinguish between previous and next tab. Functionality not used.
407 bool WebKitEngineService::prevTab()
409 // Empty implementation, with random UUID as ID we cannot distinguish between previous and next tab. Functionality not used.
413 void WebKitEngineService::confirmationResult(WebConfirmationPtr c)
415 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
417 M_ASSERT(c && c->getTabId() != TabId());
419 // check if still exists
420 if (m_tabs.find(c->getTabId()) == m_tabs.end()) {
424 m_tabs[c->getTabId()]->confirmationResult(c);
427 bool WebKitEngineService::isPrivateMode(const TabId& id)
429 BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
430 return m_tabs[id]->isPrivateMode();
433 std::shared_ptr<tizen_browser::tools::BrowserImage> WebKitEngineService::getSnapshotData(int width, int height)
435 M_ASSERT(m_currentWebView);
437 return m_currentWebView->captureSnapshot(width, height);
439 return std::make_shared<tizen_browser::tools::BrowserImage>();
443 std::shared_ptr<tizen_browser::tools::BrowserImage> WebKitEngineService::getSnapshotData(TabId id, int width, int height){
444 return m_tabs[id]->captureSnapshot(width,height);
447 void WebKitEngineService::setFocus()
449 M_ASSERT(m_currentWebView);
450 m_currentWebView->setFocus();
453 void WebKitEngineService::clearFocus()
455 M_ASSERT(m_currentWebView);
456 m_currentWebView->clearFocus();
459 bool WebKitEngineService::hasFocus() const
461 M_ASSERT(m_currentWebView);
462 return m_currentWebView->hasFocus();
466 std::shared_ptr<tizen_browser::tools::BrowserImage> WebKitEngineService::getFavicon()
468 M_ASSERT(m_currentWebView);
469 if (m_currentWebView) {
471 return std::make_shared<tizen_browser::tools::BrowserImage>();
473 return m_currentWebView->getFavicon();
475 return std::make_shared<tizen_browser::tools::BrowserImage>();
478 void WebKitEngineService::webViewClicked()
480 AbstractWebEngine::webViewClicked();
484 int WebKitEngineService::getZoomFactor() const
486 if(!m_currentWebView)
488 return static_cast<int>(m_currentWebView->getZoomFactor()*100);
492 void WebKitEngineService::setZoomFactor(int zoomFactor)
494 M_ASSERT(m_currentWebView);
495 m_currentWebView->setZoomFactor(0.01*zoomFactor);
499 void WebKitEngineService::clearPrivateData()
501 for(std::map<TabId, WebViewPtr>::const_iterator it = m_tabs.begin(); it != m_tabs.end(); it++){
502 it->second->clearPrivateData();
506 void WebKitEngineService::searchOnWebsite(const std::string & searchString, int flags)
508 m_currentWebView->searchOnWebsite(searchString, flags);
511 void WebKitEngineService::_IMEStateChanged(bool enable)
513 IMEStateChanged(enable);
516 void WebKitEngineService::backButtonClicked()
518 M_ASSERT(m_currentWebView);
519 if (isBackEnabled()) {
520 m_currentWebView->back();
521 } else if (m_currentWebView->isPrivateMode()) {
529 void WebKitEngineService::switchToDesktopMode()
531 M_ASSERT(m_currentWebView);
532 m_currentWebView->switchToDesktopMode();
535 void WebKitEngineService::switchToMobileMode()
537 M_ASSERT(m_currentWebView);
538 m_currentWebView->switchToMobileMode();
541 bool WebKitEngineService::isDesktopMode() const
543 M_ASSERT(m_currentWebView);
544 return m_currentWebView->isDesktopMode();
547 void WebKitEngineService::scrollView(const int& dx, const int& dy)
549 m_currentWebView->scrollView(dx, dy);
552 } /* end of webkitengine_service */
553 } /* end of basic_webengine */
554 } /* end of tizen_browser */